Verschachtelte BB-Codes (z.B. [quote]) richtig parsen

07.03.2008

PHP - Code:
<?php
 
   function replace_quotes ($text, $from = null) {
      if ($from !== null) {
         $text = substr (
                     $text,
                     strpos ($text, ']') + 1,
                     -1 * strlen ('[/quote]'));
      }
 
      $text = preg_replace (
                  '!\[quote=(.*?)\]((?>\[)(?R)|.)*\[/quote\]!ise',
                  "replace_quotes('$0', '$1')",
                  $text);
 
      if ($from !== null) {
         return '<quote=' . $from . '>' . $text . '</quote>';
      } else {
         return $text;
      }
   }
 
?>

Der reguläre Ausdruck sucht den Anfang eines Quote BB-Tags, mit ?>\[ wird dann geschaut, ob erneut ein BB-Tag geöffnet wird. Trifft dies zu, so wird auf den gefunden Abschnitt erneut der reguläre Ausdruck (rekursiv) angewendet. Am Ende vom regulären Ausdruck wird geprüft, ob der Quote-Tag auch wieder Ordnungsgemäß geschlossen wurde.

Genaugenommen handelt es sich aus Sicht der Informatik nicht mehr um einen regulären Ausdruck, da sich über den rekursiven Aufruf die Klammer-Paare einander eindeutig zuordnen lassen und preg damit eine größere Sprachmenge als die regulären Ausdrücke der (theoretischen) Informatik umfasst.

Der folgende Code-Abschnitt zeigt noch die Verwendung der Funktion.
PHP - Code:
<?php
   $text = 'test [quote=foo]test1[quote=bar]test2[/quote]ddd[/quote] ggl';
   echo replace_quotes ($text) . "\n";
?>

Für die Ausgabe sollte der Code der return Anweisung in der Funktion replace_quotes() noch angepasst werden.

Möchte man auch Quote-Tags ohne Namensnennung zulassen, so muss man den Part =(.*?) als Optional deklarieren.

Deine Meinung ist gefragt:


Es wurden noch keine Kommentare geposted.

Sei der Erste und teile uns Deine Meinung mit.

Einen neuen Kommentar erstellen...