preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback — Realiza una búsqueda y sustitución de una expresión regular usando una llamada de retorno
Descripción
$pattern
, callable $callback
, mixed $subject
[, int $limit = -1
[, int &$count
]] )
El comportamiento de esta función es casi idéntico al de
preg_replace(), excepto por el hecho de que en vez
del parámetro replacement, se debería especificar
callback.
Parámetros
-
pattern -
El patron de búsqueda. Puede ser tanto un cadena como un array de cadenas.
-
callback -
Una llamada de retorno que será llamada y pasada a un array de elementos coincidentes en la cadena
subject. La llamada de retorno debería devolver la cadena de sustitución. Esta es la firma de la llamada de retorno:string handler ( array$matches)A menudo se necesitará la función de
callbackpara usar preg_replace_callback() únicamente en un lugar. En este caso se puede usar una función anónima para declarar una llamada de retorno dentro de la llamada a preg_replace_callback(). Al hacerlo de este modo, se tiene toda la información de la llamada en un único lugar y no abarrota el espacio de nombres de funciones con un nombre de función de llamada de retorno que no se usa en ningún otro sitio.Ejemplo #1 preg_replace_callback() y función anónima
<?php
/* un filtro de línea de comandos estilo unix para convertir letras
* mayúsculas a minúsculas al principio de párrafos */
$fp = fopen("php://stdin", "r") or die("no se puede leer stdin");
while (!feof($fp)) {
$línea = fgets($fp);
$línea = preg_replace_callback(
'|<p>\s*\w|',
function ($coincidencias) {
return strtolower($coincidencias[0]);
},
$línea
);
echo $línea;
}
fclose($fp);
?> -
subject -
La cadena o un array de cadenas a buscar y reemplazar.
-
limit -
Las sustituciones máximas posibles por cada patrón en cada cadena
subject. Por defecto -1 (sin límite). -
count -
Si se especifica, esta variable será rellenada con el número de sustituciones hechas.
Valores devueltos
preg_replace_callback() devuelve un array si el
parámetro subject es un array, o, por el contrario
una cadena. Si se producen errores, el valor devuleto es NULL
Si se encontraron coincidencias, el nuevo sujeto será devuelto, de lo contrario
subject será devuelto sin cambios.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.1.0 |
Se añadió el parámetro count
|
Ejemplos
Ejemplo #2 Ejemplo de preg_replace_callback()
<?php
// este texto se usó en 2002
// queremos actualizarlo al 2003
$texto = "El Día de los Inocentes es el 28/12/2002\n";
$texto.= "Las últimas Navidades fueron el 24/12/2001\n";
// la función de llamada de retorno
function añoSiguiente($coincidencias)
{
// como es usual: $coincidencias[0] es la coincidencia completa
// $coincidencias[1] la coincidencia del primer sub-patrón
// encerrado entre '(...)' y así sucesivamente
return $coincidencias[1].($coincidencias[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"añoSiguiente",
$texto);
?>
El resultado del ejemplo sería:
El Día de los Inocentes es el 28/12/2003 Las últimas Navidades fueron el 24/12/2002
Ejemplo #3 preg_replace_callback() usando una estructura recursiva para manejar el código BB encapsulado
<?php
$entrada = "nivel 1 [indent] nivel 2 [indent] nivel 3 [/indent] nivel 2 [/indent] nivel 1";
function analizarEtiquetasRecursivo($entrada)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($entrada)) {
$entrada = '<div style="margin-left: 10px">'.$entrada[1].'</div>';
}
return preg_replace_callback($regex, 'analizarEtiquetasRecursivo', $entrada);
}
$salida = analizarEtiquetasRecursivo($entrada);
echo $salida;
?>
Ver también
- Patrones de PCRE
- preg_quote() - Escapar caracteres en una expresión regular
- preg_replace() - Realiza una búsqueda y sustitución de una expresión regular
- preg_last_error() - Devuelve el código de error de la última ejecución de expresión regular PCRE
- Funciones anónimas
- información acerca de tipos de llamada de retorno