2009-09-09 38 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如果你的變量可能包含正則表達式元字符。