Verschachtelte BB-Codes (z.B. [quote]) richtig parsen
07.03.2008
Author: N43
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;
}
}
?>
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";
?>
$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:
Sei der Erste und teile uns Deine Meinung mit.
Kommentare