2011-01-13 8 views
5

Ho scritto questo codice PHP per fare alcune sostituzioni:Come utilizzare l'espressione regolare preg_replace di PHP per trovare e sostituire il testo?

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% <+.'); 

risultante in questo:

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

Tuttavia avevo bisogno di identificare tag span del frutto, in questo modo:

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>. 

Comprerei un frutto a cui scoprire un'espressione regolare per realizzare questo :-)


Whit l'aiuto di Xavier Barbosa, sono venuto a questo sollution finale:

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 classe della campata interna (s) (cioè class = "b") è sempre uguale alla prima lettera del frutto? – Ass3mbler

+0

Stai scrivendo la tua lingua di template in PHP? Attenzione a [BobX] (http://thedailywtf.com/Articles/We-Use-BobX.aspx). – Nathan

+0

Ass3mbler, mi dispiace, non ho intenzione di creare una relazione con la prima lettera del contenuto. Ho modificato i nomi delle classi in qualcosa come: t1, t2 e t3. – Roger

risposta

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% <+.'); 

e una versione stateful per 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! Andando un po 'più in profondità, è possibile ottenere questo ?: Il frutto che più mi piace è: apple banna coco. – Roger

+0

Bene per questo è necessario utilizzare la funzione 'preg_replace_callback()'. Ma questa funzione è senza stato, quindi dovrai imbrogliare. Guarda l'esempio, ma attenzione, funziona solo su PHP5.3 –

+0

Perfetto! Unretouchable. Grazie. – Roger

1

Prova questo:

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

Bene, il tuo codice echos: Il frutto che più mi piace è: % apple%% banna%% orange% ... Nota che ho cambiato un po 'quello che desideravo prima. Sto immaginando come posso nominare la classe di span interno con una stringa non correlata al contenuto ... – Roger

Problemi correlati