preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

preg_replace_callbackBuscar y reemplazar mediante expresión regular estándar utilizando una función de retrollamada

Descripción

preg_replace_callback(
    string|array $pattern,
    callable $callback,
    string|array $subject,
    int $limit = -1,
    int &$count = null,
    int $flags = 0
): string|array|null

El comportamiento de preg_replace_callback() es casi idéntico al de preg_replace(), con la excepción de que en lugar del argumento replacement, se debe especificar una función de retrollamada callback que será llamada con los elementos encontrados como argumentos.

Parámetros

pattern

El patrón a buscar. Puede ser un chaîne de caractères 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:

handler(array $matches): string

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 tableau, o, de lo contrario, un chaîne de caractères. 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

If the regex pattern passed does not compile to a valid regex, an E_WARNING is emitted.

Historial de cambios

Versión Descripción
7.4.0 Se añadió el argumento flags.

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 resultado del ejemplo sería:

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;
?>

Ver también