在PHP的preg_replace使用$变量(Using $ variables in preg_r

2019-08-04 14:01发布

嗯...我如何使用变量调用的preg_replace?

这并没有工作:

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

是的, $num是一个加号preceeded。 是的,我想“ tag the $num as <$text/> ”。

Answer 1:

您所更换的模式看起来不错,但您在匹配模式中使用单引号,你的$ num变量不会被插入到它。 相反,尝试

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

还要注意的是建立从这样的“未知”输入的模式时,它通常是用一个好主意preg_quote 。 例如

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

虽然我猜给出的变量名,它总是在你的情况的数字。



Answer 2:

变量只会扩大用双引号声明字符串 。 因此,要么用双引号:

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

或者使用字符串连接:

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

你也应该看看preg_quote如果你的变量可能包含正则表达式元字符。



文章来源: Using $ variables in preg_replace in PHP