Использование $ переменных в preg_replace в PHP - PullRequest
10 голосов
/ 09 сентября 2009

Ммм ... как мне использовать переменные в вызове preg_replace?

Это не сработало:

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

Да, $num предшествует знак плюс. Да, я хочу "tag the $num as <$text/>".

Ответы [ 2 ]

13 голосов
/ 09 сентября 2009

Ваш шаблон замены выглядит нормально, но поскольку вы использовали одинарные кавычки в соответствующем шаблоне, ваша переменная $ num не будет вставлена ​​в него. Вместо этого попробуйте

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

Также обратите внимание, что при построении шаблона из «неизвестных» входов, подобных этому, обычно хорошей идеей является использование preg_quote . например,

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

Хотя я предполагаю, что, учитывая имя переменной, она всегда числовая.

12 голосов
/ 09 сентября 2009

Переменные будут раскрываться только в строках, объявленных в двойных кавычках . Так что либо используйте двойные кавычки:

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

Или использовать конкатенацию строк:

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

Вам также следует взглянуть на preg_quote, если ваши переменные могут содержать метасимволы регулярного выражения.

...