Using $ variables in preg_replace in PHP

2020-06-03 00:22发布

Ummm... how do I use variables in a call to preg_replace?

This didn't work:

foreach($numarray as $num => $text)
    {
        $patterns[] = '/<ces>(.*?)\+$num(.*?)<\/ces>/';
        $replacements[] = '<ces>$1<$text/>$2</ces>';
    }

Yes, the $num is preceeded by a plus sign. Yes, I want to "tag the $num as <$text/>".

2条回答
叼着烟拽天下
2楼-- · 2020-06-03 00:51

Your replacement pattern looks ok, but as you've used single quotes in the matching pattern, your $num variable won't be inserted into it. Instead, try

$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';

Also note that when building up a pattern from "unknown" inputs like this, it's usually a good idea to use preg_quote. e.g.

$patterns[] = '/<ces>(.*?)\+'.preg_quote($num).'(.*?)<\/ces>/';

Though I guess given the variable name it's always numeric in your case.

查看更多
▲ chillily
3楼-- · 2020-06-03 01:05

Variables will only be expanded in strings declared with double quotes. So either use double quotes:

$patterns[]     = "/<ces>(.*?)\\+$num(.*?)<\\/ces>/";
$replacements[] = "<ces>$1<$text/>$2</ces>";

Or use string concatenation:

$patterns[]     = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';

You should also take a look at preg_quote if your variables may contain regular expression meta characters.

查看更多
登录 后发表回答