EisFuX: preg_replace()

Beitrag lesen

Hey und hallo Hendrik,

Solltest du die Dokumentation zur BB-Parser-Klasse gefunden haben, dann lies dich mal da ein ... Sie (die Klasse) hat den Vorteil, dass sie die BBCode-Tags nicht blind ersetzt. Mit str_replace() und preg_replace() gebastelte BBCode-Ersetzungen haben nämlich den Nachteil, dass man als Benutzer damit schönen Unfug anstellen kann. Das beginnt bei nicht validem HTML, weil man bestimmte Tags unpassend ineinander schachteln kann. Weiter gehts mit einem "verhauenem" Layout, weil einfach das schließende Tag vergessen wurde. Zumindest die letztere Gefahr kann man minimieren, wenn man für die Formatierung CSS-Klassen einsetzt und BBCode-Bereiche in eigene Container (bspw. DIVs) sperrt.

Trotzdem finde ich die Variante mit preg_replace() nicht ganz schlecht, man kann zumindest beim Experimentieren damit eine ganze Menge lernen. Folgendes Konstrukt

  
$ergebnis = preg_replace('/\[(\/?)([biuq])\]/i', '<$1$2>', $text);  

... ersetzt zum Beispiel 10 Zeilen deines Quelltextes:

$ergebnis = str_replace("[b]","<b>",$ergebnis);
  $ergebnis = str_replace("[/b]","</b>",$ergebnis);
  $ergebnis = str_replace("[i]","<i>",$ergebnis);
  $ergebnis = str_replace("[/i]","</i>",$ergebnis);
  $ergebnis = str_replace("[u]","<u>",$ergebnis);
  $ergebnis = str_replace("[/u]","</u>",$ergebnis);

$ergebnis = str_replace ("[q]","&raquo;",$ergebnis);
  $ergebnis = str_replace ("[/q]","&laquo;",$ergebnis);
  $ergebnis = str_replace ("[qs]","&rsaquo;",$ergebnis);
  $ergebnis = str_replace ("[/qs]","&lsaquo;",$ergebnis);

q-Tags kann man in HTML schachteln. Ein aktueller Browser (oder/und ein gutes CSS) setzt dann die entsprechenden Gänsefüßchen automatisch.

Und wenn du später noch auf die Idee kommst, Listen formatieren zu wollen, dann erweiterst du den RegEx eben ein bisschen:

  
$ergebnis = preg_replace('/\[(\/?)([biuq]|li|ul)\]/i', '<$1$2>', $text);  

..., aber wie kann ich z.B. wie in diesem Forum hier auch meinen Besuchern anbieten, auf andere Internetseiten zu verlinken, so dass die Besucher dann nur so etwas wie hier auch schreiben müssen:
<http://de.selfhtml.org@....damit man's sehen kann>

Weiß jetzt nicht auf Anhieb, aber im BBCode-Stil ist doch eher das [url]...[/url] üblich. Also so:

  
$ergebnis = preg_replace('/\[url\]\s*(.+):(.+)\s*\[\/url\]/i', '<a href="$1&#58;$2">$1&#58;$2</a>', $text);  

... oder mit "sprechenden" Links:

  
$ergebnis = preg_replace('/\[url\]\s*(.+):(.+)\s*\@(title|name)=(.+)\s*\[\/url\]/i', '<a href="$1&#58;$2">$4</a>', $text);  

... oder du wandelst einfach alles, was so ähnlich*) wie eine URL aussieht, in einen HTML-Link um:

  
$ergebnis = preg_replace('/(http\:\/\/[^\s\>]+)(\s)/', '<a href="$1">$1</a>$2', $text);  

*) Die Betonung liegt auf "so ähnlich", weil es für die Zeichen, die in einer URL stehen dürfen/können, genaue Festlegungen gibt. Für die meisten Fälle reicht aber der reguläre Ausdruck, den ich verwendet habe, aber aus.

MffG
EisFuX

--
Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
Stanisław Lem