preg_replace Problem
bearbeitet von Rolf bUnter anderem, weil er schlecht funktioniert. Sollte
~~~
TEXTTEXT {{ ZITAT 1 { ZITAT FORTSETZUNG }} ENDE TEXT
~~~
nicht
~~~
TEXTTEXT <blockquote> ZITAT 1 { ZITAT FORTSETZUNG </blockquote> ENDE TEXT
~~~
ergeben? Tut es aber nicht.
Ob es fertige Tools gibt, die die gewünschte Übersetzung durchführen, weiß ich nicht.
Ich habe es mal mit einer Assertion versucht. Das Pattern matcht zuerst ein {{ und macht die Assertion, dass darauf kein weiteres {{ folgt. Dann matcht es beliebige Zeichen, aber non-greedy, und ein }}. Der non-greedy Match sorgt dafür, dass .* bei einem geschachtelten Zitat das innere }} nicht einschließt.
Das ganze legst Du in eine Schleife und machst es so lange, wie etwas ersetzt wird. Die Spielerei mit $i soll nur anzeigen, in welcher Reihenfolge er die Zitate ersetzt.
~~~php
$text = "TEXTTEXT {{ ZITAT 1 {{ ZITAT 2 }} Z1 }} {{ ENDE }} TEXT";
$i=1;
while (true) {
$textNeu = preg_replace("//{{(?!.*{{)(.*?)}}/i","<quote$i>$1</quote$i>",$text);
if ($text === $textNeu) break;
$text = $textNeu;
$i++;
}
echo $text;
~~~
Eine Lösung ohne Regex wäre wohl ein handgemachter Parser, der von links nach rechts durchgeht und einen Quote-Stack bildet, oder die Nutzung einer PHP Library, die ich nicht kenne.
_Rolf_