2009-09-09 22 views
8

Ummm ... ¿cómo utilizo 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 es precedido por un signo más. Sí, quiero "tag the $num as <$text/>".

Respuesta

12

Su patrón de reemplazo se ve bien, pero como ha utilizado comillas simples en el patrón coincidente, su variable $ num no se insertará en él. En su lugar, tratar

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

También tenga en cuenta que cuando la creación de un patrón de entradas "desconocidos" de este tipo, por lo general es una buena idea usar preg_quote. p.ej.

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

Aunque supongo que dado el nombre de la variable siempre es numérico en su caso.

+0

Gracias Gumbo, Paul - ¡sus dos entradas ayudaron! – Steve

12

Las variables solo se ampliarán en strings declared with double quotes. Así que, o utilizar comillas dobles:

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

O uso de concatenación:

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

También debería echar un vistazo a preg_quote si sus variables pueden contener meta-caracteres de expresiones regulares.

Cuestiones relacionadas