2011-01-13 10 views
5

Ich schrieb diesen PHP-Code einige Substitutionen zu machen:Wie verwende ich den regulären Ausdruck preg_replace, um Text zu finden und zu ersetzen?

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

in diese Resultierende:

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

Allerdings musste ich die Frucht des span-Tags identifizieren, wie folgt aus:

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

Ich würde eine Frucht kaufen, zu der man einen regulären Ausdruck findet, um das zu erreichen :-)


Whit der Xavier Barbosa Hilfe, kam ich zu diese letzte 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

die Klasse der inneren Spannweite (s) class = "b") ist immer gleich dem ersten Buchstaben der Frucht? – Ass3mbler

+0

Schreiben Sie Ihre eigene Template-Sprache in PHP? Vorsicht vor [BobX] (http://thedailywtf.com/Articles/We-Use-BobX.aspx). – Nathan

+0

Ass3bler, Entschuldigung, ich hatte nicht die Absicht, eine Beziehung mit dem ersten Buchstaben des Inhalts herzustellen. Ich habe die Klassennamen wie folgt geändert: t1, t2 und t3. – Roger

Antwort

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

und eine Stateful-Version für 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! Geht man etwas tiefer, ist es möglich, das zu bekommen ?: Die Frucht, die ich am meisten mag, ist: Apfel banna Coco. – Roger

+0

Dazu müssen Sie die Funktion 'preg_replace_callback()' verwenden. Aber diese Funktion ist zustandslos, du musst also schummeln. Siehe das Beispiel, aber Vorsicht, es funktioniert nur auf PHP5.3 –

+0

Perfekt! Unerreichbar. Vielen Dank. – Roger

1

Try this:

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

Nun, Ihre Code-Echos: Die Frucht, die ich am meisten mag ist: % apple%% banna%% orange% ... Beachten Sie, dass ich ein bisschen verändert habe, was ich zuerst wollte. Ich stelle mir vor, wie ich die innere Spannungsklasse mit einer Schnur bezeichnen kann, die nicht mit dem Inhalt verwandt ist ... – Roger

Verwandte Themen