2012-06-24 22 views
27

que tienen la siguiente declaración HTMLCómo usar preg_replace_callback?

[otsection]Wallpapers[/otsection] 
WALLPAPERS GO HERE 

[otsection]Videos[/otsection] 
VIDEOS GO HERE 

Lo que estoy tratando de hacer es reemplazar las etiquetas [otsection] con un div html. El problema es que quiero para incrementar el id de la div a partir de 1-> 2-> 3, etc ..

Así, por ejemplo, la afirmación anterior debería traducirse a

<div class="otsection" id="1">Wallpapers</div> 
WALLPAPERS GO HERE 

<div class="otsection" id="2">Videos</div> 
VIDEOS GO HERE 

Por lo que yo puede investigar, la mejor manera de hacerlo es mediante un preg_replace_callback para incrementar la variable id entre cada reemplazo. Pero después de 1 hora de trabajar en esto, simplemente no puedo hacer que funcione.

¡Cualquier ayuda con esto sería muy apreciada!

Respuesta

38

Usar la siguiente:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    function($m) { 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    }, 
    $in); 

En particular, tenga en cuenta que he usado una variable static. Esta variable persiste en todas las llamadas a la función, lo que significa que se incrementará cada vez que se llame a la función, lo que sucede para cada coincidencia.

Además, tenga en cuenta que precede ots a la identificación. Los identificadores de elemento no deben comenzar con números.


Para PHP antes de 5.3:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    create_function('$m',' 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    '), 
    $in); 
+0

¿Cómo se puede obtener el '$ in' poblado con el asunto? –

+0

@SheikhHeera Eso ya debería estar allí. Usualmente uso '$ in' y' $ out' para mostrar dónde entran y salen los datos. –

+0

Buena respuesta, de todos modos. –

22

Nota: El siguiente está destinada a ser una respuesta general y no intenta resolver un problema específico de la OP, ya que ya ha sido addressed before .

Lo que es preg_replace_callback()?

Esta función se utiliza para realizar una expresión regular de búsqueda y reemplazo. Es similar a str_replace(), pero en lugar de cadenas simples, busca un patrón de expresiones regulares definido por el usuario y luego aplica la función de devolución de llamada en los elementos coincidentes. La función devuelve la cadena modificada si se encuentran coincidencias, de lo contrario, la cadena no modificada.

¿Cuándo debería usarlo?

preg_replace_callback() es muy similar a preg_replace() - la única diferencia es que en lugar de especificar una cadena de reemplazo para el segundo parámetro, se especifica una función callback.

Utilice preg_replace() cuando desee realizar una búsqueda y reemplazo de expresiones regulares simples. Use preg_replace_callback() cuando desee hacer algo más que simplemente reemplazar. Vea el ejemplo a continuación para entender cómo funciona.

¿Cómo usarlo?

Aquí hay un ejemplo para ilustrar el uso de la función. Aquí, estamos tratando de convertir una cadena de fecha del formato YYYY-MM-DD al DD-MM-YYYY.

// our date string 
$string = '2014-02-22'; 

// search pattern 
$pattern = '~(\d{4})-(\d{2})-(\d{2})~'; 

// the function call 
$result = preg_replace_callback($pattern, 'callback', $string); 

// the callback function 
function callback ($matches) { 
    print_r($matches); 
    return $matches[3].'-'.$matches[2].'-'.$matches[1]; 
} 

echo $result; 

Aquí, nuestro modelo de expresión regular busca una cadena de fecha del formato NNNN-NN-NN donde N podría ser un dígito que van 0-9 (\d es una representación abreviada de la clase de caracteres [0-9]). Se llamará a la función de devolución de llamada y se pasará una matriz de elementos coincidentes en la cadena dada.

El resultado final será:

22-02-2014 

Nota: El ejemplo anterior es sólo para fines de ilustración. Usted no debería usar para analizar las fechas. Use DateTime::createFromFormat() y DateTime::format() en su lugar. This question tiene más detalles.