2011-01-13 9 views
5

de escribir este código PHP para hacer algunas sustituciones:Cómo usar PHP preg_replace expresión regular para buscar y reemplazar texto?

function cambio($txt){ 
    $from=array(
     '/\+\>([^\+\>]+)\<\+/', //finds +>text<+ 
     '/\%([^\%]+)\%/', //finds %text% 
    ); 

    $to=array(
     '<span class="P">\1</span>', 
     '<span>\1</span>', 
    ); 

    return preg_replace($from,$to,$txt); 
} 

echo cambio('The fruit I most like is: +> %apple% %banna% %orange% <+.'); 

resultante en esto:

The fruit I most like is: <span class="P"> <span>apple</span> <span>banna</span> <span>orange</span> </span>. 

Sin embargo necesitaba para identificar etiquetas span de la fruta, así:

The fruit I most like is: <span class="P"> <span class="t1">apple</span> <span class="t2">banana</span> <span class="t3">coco</span> </span>. 

Compraría una fruta para descubrir una expresión regular para lograr esto :-)


Whit ayuda del Xavier Barbosa, vine a esta última sollution:

function matches($matches){ 
    static $pos=0; 
    return sprintf('<span class="t%d">%s</span>',++$pos,$matches[1]); 
} 

function cambio($txt){//Markdown da Atípico : Deve ser usado depois do texto convertido para markdown 
    $from=array(
     '/\=>(.+?)<\=/', //finds: =>text<= 
     '/\+>(.+?)<\+/', //finds +>text<+ 
    ); 

    $to=array(
     '<span class="T">\1</span>', 
     '<span class="P">\1</span>', 
    ); 

    $r=preg_replace($from,$to,$txt); 
    return preg_replace_callback('/%(.*?)%/','matches',$r);//finds %text% 
    //'/%((\w)\w+)%/' //option 
} 
+0

la clase del espacio interior (s) (es decir class = "b") siempre es igual a la primera letra de la fruta? – Ass3mbler

+0

¿Está escribiendo su propio lenguaje de plantillas en PHP? Tenga cuidado con [BobX] (http://thedailywtf.com/Articles/We-Use-BobX.aspx). – Nathan

+0

Ass3mbler, lo siento, no tenía la intención de hacer una relación con la primera carta del contenido. Edité los nombres de clase a algo como: t1, t2 y t3. – Roger

Respuesta

2
<?php 


function cambio($txt){ 
    $from=array(
     '/\+>(.+?)<\+/', //finds +>text<+ 
     '/%((\w)\w+)%/', //finds %text% 
    ); 

    $to=array(
     '<span class="P">\1</span>', 
     '<span class="\2">\1</span>', 
    ); 

    return preg_replace($from,$to,$txt); 
} 

echo cambio('The fruit I most like is: +> %apple% %banna% %orange% <+.'); 

y una versión con estado de PHP5.3

function cambio($txt) { 
    return preg_replace_callback('/\+>(.+?)<\+/', function ($matches) { 
     $txt = sprintf('<span class="P">%s</span>', $matches[1]); 

     return preg_replace_callback('/%(\w+)%/', function ($matches) { 
      static $pos = 0; 
      return sprintf('<span class="t%d">%s</span>', ++$pos, $matches[1]); 
     }, $txt); 

    }, $txt); 
} 

echo cambio('The fruit I most like is: +> %apple% %banna% %orange% <+.'); 
+0

Obrigado/Gracias, Xavier! Yendo un poco más profundo, ¿es posible obtener esto ?: La fruta que más me gusta es: apple banna coco. – Roger

+0

Bueno para esto necesitarás usar la función 'preg_replace_callback()'. Pero esta función no tiene estado, por lo que tendrás que hacer trampa. Mira el ejemplo, pero ten cuidado, solo funciona en PHP5.3 –

+0

¡Perfecto! Indespensable Gracias. – Roger

1

Prueba esto:

function cambio($txt){ 
    $from=array(
     '/\+\>([^\+\>]+)\<\+/', //finds +>text<+ 
     '/\%(^\%)([^\%]+)\%/', //finds %text% 
    ); 

    $to=array(
     '<span class="P">\1</span>', 
     '<span class="\1">\1\2</span>', 
    ); 

    return preg_replace($from,$to,$txt); } 

echo cambio('The fruit I most like is: 
+> %apple% %banna% %orange% <+.'); 
+0

Bueno, su código echos: La fruta que más me gusta es: % apple%% banna%% orange% ... Tenga en cuenta que he cambiado un poco lo que primero deseaba. Me estoy imaginando cómo puedo nombrar la clase span interno con una cadena no relacionada con el contenido ... – Roger

Cuestiones relacionadas