Usando $ variables en preg_replace en PHP
-
05-07-2019 - |
Pregunta
Ummm ... ¿cómo uso variables en una llamada a preg_replace?
Esto no funcionó:
foreach($numarray as $num => $text)
{
$patterns[] = '/<ces>(.*?)\+$num(.*?)<\/ces>/';
$replacements[] = '<ces>$1<$text/>$2</ces>';
}
Sí, el $num
está precedido por un signo más. Sí, quiero & Quot; tag the $num as <$text/>
& Quot ;.
Solución
Su patrón de reemplazo se ve bien, pero como ha usado comillas simples en el patrón coincidente, su variable $ num no se insertará en él. En su lugar, intente
$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';
También tenga en cuenta que al construir un patrón desde " desconocido " entradas como esta, generalmente es una buena idea usar preg_quote . por ejemplo,
$patterns[] = '/<ces>(.*?)\+'.preg_quote($num).'(.*?)<\/ces>/';
Aunque supongo que dado el nombre de la variable siempre es numérico en su caso.
Otros consejos
Las variables solo se expandirán en cadenas declaradas con comillas dobles . Entonces, use comillas dobles:
$patterns[] = "/<ces>(.*?)\\+$num(.*?)<\\/ces>/";
$replacements[] = "<ces>$1<$text/>$2</ces>";
O use la concatenación de cadenas:
$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';
También debe echar un vistazo a preg_quote
si sus variables pueden contener metacaracteres de expresión regular.