2009-09-09 142 views
8

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

这不起作用:

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

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

回答

12

您的替换模式看起来不错,但由于您在匹配模式中使用了单引号,因此您的$ num变量不会被插入到其中。相反,尝试

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

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

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

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

+0

感谢Gumbo,Paul - 您的投入都有帮助! – Steve 2009-09-09 16:56:58

12

变量只会在strings declared with double quotes中扩大。因此,无论使用双引号:

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

或者使用字符串连接:

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

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