preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)
preg_replace_callback — Buscar y reemplazar mediante expresión regular estándar utilizando una función de retrollamada
Parámetros
pattern
-
El patrón a buscar. Puede ser un string o un array que contenga
cadenas.
callback
-
La función de retrollamada que recibirá el array de elementos
encontrados en la cadena subject.
La función de retrollamada debe devolver la cadena de
reemplazo. Esta es la firma de la función de retrollamada:
Con frecuencia, la función callback se utiliza
con preg_replace_callback() en un solo lugar.
En este caso, puede simplemente utilizar una
función anónima
para declarar una función de retrollamada para
preg_replace_callback().
Al hacer esto, se concentran todas las rutinas relacionadas con
el reemplazo en un solo lugar, y no se contamina el espacio de nombres de funciones con funciones de un solo uso.
Ejemplo #1 preg_replace_callback() y
función anónima
<?php
// Un filtro de línea de comandos Unix para convertir la primera letra
// de los párrafos (que comienzan con "<p>") a minúscula
$fp = fopen("php://stdin", "r") or die("No se puede leer la línea de comandos");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
function ($matches) {
return strtolower($matches[0]);
},
$line
);
echo $line;
}
fclose($fp);
?>
subject
-
La cadena o el array de cadenas a buscar y reemplazar.
limit
-
El número máximo de reemplazos para cada patrón
en cada cadena subject.
Por omisión, vale -1 (sin límite).
count
-
Si se proporciona, esta variable será rellenada con el número de reemplazos realizados.
flags
-
flags puede ser una combinación de los indicadores
PREG_OFFSET_CAPTURE y
PREG_UNMATCHED_AS_NULL, que influyen en el formato
del array de coincidencias.
Consulte la descripción de preg_match() para más detalles.
Valores devueltos
preg_replace_callback() devuelve un array si el argumento
subject es un array, o, de lo contrario, un string.
Si ocurre un error, el valor devuelto será null.
Si se encuentran coincidencias, se devuelve el nuevo sujeto, de lo contrario
subject se devuelve sin cambios.
Errores/Excepciones
Si el patrón regex pasado no se compila a una regex válida, se emite una E_WARNING.
Ejemplos
Ejemplo #2 Ejemplo con preg_replace_callback()
<?php
// Este texto era cierto en 2002
// queremos actualizarlo para 2003
$text = "El primer abril es el 04/01/2002\n";
$text.= "La última navidad fue el 12/24/2001\n";
// Función de retrollamada
function next_year($matches)
{
// como de costumbre: $matches[0] representa el valor total
// $matches[1] representa el primer paréntesis capturante
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);
?>
El ejemplo anterior mostrará:
El primer abril es el 04/01/2003
La última navidad fue el 12/24/2002
Ejemplo #3 Ejemplo con preg_replace_callback() utilizando una estructura recursiva
para manejar BB code
<?php
$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";
function parseTagsRecursive($input)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}
return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}
$output = parseTagsRecursive($input);
echo $output;
?>