The first example is bad, because it creates function for every line it processes. When the file has many lines, you could easily run out of memory. The code should be changed so, that create_function() is used outside of loop.
preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback — Realizar una búsqueda con expresiones regulares y generar reemplazos usando una llamada de retorno
Descripción
El comportamiento de esta función es casi idéntico al de preg_replace(), con la excepción de que en lugar del parámetro reemplazo , uno debe especificar una llamada_de_retorno .
Lista de parámetros
- patron
-
El patrón a buscar. Puede ser una cadena o una matriz con cadenas.
- llamada_de_retorno
-
Una llamada de retorno que será usada pasándole una matriz de los elementos coincidentes en asunto . La llamada de retorno debería devolver la cadena de reemplazo.
Con frecuencia necesitará la función de llamada de retorno cuando use preg_replace_callback() únicamente en un lugar. En este caso, usted puede usar create_function() para declarar una función anónima como llamada de retorno dentro del llamado a preg_replace_callback(). Al hacerlo de este modo, usted tendrá toda la información necesaria para el llamado en un solo lugar y no abarrota su espacio de nombres de funciones con nombres de llamadas de retorno que no son usadas en ninguna otra parte.
Example #1 preg_replace_callback() y create_function()
<?php
/* un filtro de línea de comandos tipo Unix para convertir letras
* mayúsculas al comienzo de los parágrafos a minúsculas */
$da = fopen("php://stdin", "r") or die("no se puede leer stdin");
while (!feof($da)) {
$linea = fgets($da);
$linea = preg_replace_callback(
'|<p>\s*\w|',
create_function(
// las comillas sencillas son cruciales aquí,
// o alternativamente escapar todos los signos $ como \$
'$coincidencias',
'return strtolower($coincidencias[0]);'
),
$linea
);
echo $linea;
}
fclose($da);
?> - asunto
-
La cadena o una matriz con cadenas para buscar y reemplazar.
- limite
-
La cantidad máxima posible de reemplazos para cada patrón en cada cadena asunto . Su valor predeterminado es -1 (sin límite).
- conteo
-
Si se especifica, esta variables será llenada con el número de reemplazos realizados.
Valores retornados
preg_replace_callback() devuelve una matriz si el parámetro asunto es una matriz, o una cadena de lo contrario.
Si se encuentran coincidencias, el nuevo asunto será devuelto, de otra forma asunto será devuelto intacto.
Registro de cambios
| Versión | Descripción |
|---|---|
| 5.1.0 | El parámetro conteo fue agregado |
Ejemplos
Example #2 Ejemplo de preg_replace_callback()
<?php
// este texto fue usado en 2002
// queremos actualizarlo para 2003
$texto = "El día de los inocentes es 04/01/2002\n";
$texto.= "La última navidad fue 12/24/2001\n";
// la llamada de retorno
function siguiente_anyo($coincidencias)
{
// como es usual: $coincidencias[0] es la coincidencia completa
// $coincidencias[1] la coincidencia para el primer subpatrón
// ubicado entre '(...)' y así sucesivamente
return $coincidencias[1].($coincidencias[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"siguiente_anyo",
$texto);
?>
El resultado del ejemplo seria:
El día de los inocentes es 04/01/2003 La última navidad fue 12/24/2002
Example #3 preg_replace_callback() usando una estructura recursiva para manejar código BB encapsulado
<?php
$entrada = "plano [indent] profundo [indent] más profundo [/indent] profundo [/indent] plano";
function procesarEtiquetasRecursivamente($entrada)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($entrada)) {
$entrada = '<div style="margin-left: 10px">'.$entrada[1].'</div>';
}
return preg_replace_callback($regex, 'procesarEtiquetasRecursivamente', $entrada);
}
$salida = procesarEtiquetasRecursivamente($entrada);
echo $salida;
?>
preg_replace_callback
20-May-2008 12:14
24-Jun-2007 01:56
preg_replace_callback returns NULL when pcre.backtrack_limit is reached; this sometimes occurs faster then you might expect. No error is raised either; so don't forget to check for NULL yourself
26-Apr-2006 11:16
it is much better on preformance and better practice to use the preg_replace_callback function instead of preg_replace with the e modifier.
function a($text){return($text);}
// 2.76 seconds to run 50000 times
preg_replace("/\{(.*?)\}/e","a('\\1','\\2','\\3',\$b)",$a);
// 0.97 seconds to run 50000 times
preg_replace_callback("/\{(.*?)\}/s","a",$a);
