Использование переменных $ в preg_replace в PHP
-
05-07-2019 - |
Вопрос
Эммм...как использовать переменные при вызове preg_replace?
Это не сработало:
foreach($numarray as $num => $text)
{
$patterns[] = '/<ces>(.*?)\+$num(.*?)<\/ces>/';
$replacements[] = '<ces>$1<$text/>$2</ces>';
}
Да, $num
предшествует знак плюс.Да, я хочу "tag the $num as <$text/>
".
Решение
Ваш шаблон замены выглядит нормально, но поскольку вы использовали одинарные кавычки в соответствующем шаблоне, ваша переменная $num не будет вставлена в него.Вместо этого попробуйте
$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';
Также обратите внимание, что при построении шаблона из «неизвестных» входных данных, подобных этому, обычно рекомендуется использовать preg_quote.например
$patterns[] = '/<ces>(.*?)\+'.preg_quote($num).'(.*?)<\/ces>/';
Хотя я думаю, учитывая имя переменной, в вашем случае оно всегда числовое.
Другие советы
Переменные будут раскрываться только в строки объявлены в двойных кавычках . Так что либо используйте двойные кавычки:
$patterns[] = "/<ces>(.*?)\\+$num(.*?)<\\/ces>/";
$replacements[] = "<ces>$1<$text/>$2</ces>";
Или используйте конкатенацию строк:
$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';
Вам также следует ознакомиться с preg_quote
, если ваши переменные могут содержать метасимволы регулярного выражения. р>