Funciones de PCRE
PHP Manual

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5)

preg_replace_callbackRealiza una búsqueda y sustitución de una expresión regular usando una llamada de retorno

Descripción

mixed preg_replace_callback ( mixed $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 una matriz de cadenas.

callback

Una llamada de retorno que será llamada y pasada a una matriz de elementos coincidentes en la cadena subject. La llamada de retorno debería devolver la cadena de sustitución.

A menudo se necesitará la función de callback para usar preg_replace_callback() únicamente en un lugar. En este caso se puede usar una función anónima (desde PHP 5.3.0) o usar create_function() para declarar una función anónima como 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 create_function()

<?php
/* un filtro de línea de comandos estilo unix para convertir letras
 * mayúsculas en 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|',
        
create_function(
            
// las comillas simples son esenciales aquí,
            // o como alternativa, escapar todos los $ como \$
            
'$coincidencias',
            
'return strtolower($coincidencias[0]);'
        
),
        
$línea
    
);
    echo 
$línea;
}
fclose($fp);
?>

subject

La cadena o matriz 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 una matriz si el parámetro subject es una matriz, 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


Funciones de PCRE
PHP Manual