Использование переменных $ в preg_replace в PHP

Ummm … как использовать переменные при вызове 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 если ваши переменные могут содержать метасимволы регулярного выражения.