AAAAAAAAAAAAAAAAlso:
In der BBCode wird die Funktion bbencode_second_pass() aufgerufen, um einen mit Formatierung versehenen Text eben zu formatieren.
Was passiert dann:
- Die bbcode.tpl wird eingelesen und zerlegt mit "load_bbcode_template()" und in das Array $bbcode_tpl[] geladen.
- Die Daten im Array werden für BBCodes mit möglichen Optionen entsprechend darauf vorbereitet.
- Jetzt werden die eigentlichen Ersetzungsfilter für die evtl. verfügbaren BBCodes erstellt, deren Suchkriterien selbst mir oft ein böhmisches Dorf sind

- Dann werden diese Suchkriterien in den einzelnen Array-Keys ($bbcode_tpl[]) ersetzt
- Fertig.
Zwischendurch wird noch der Text nach CODE durchforstet (bbencode_second_pass_code()), also bevor die eigentlichen Filter gesetzt werden. Dabei geht es vordergründig um das korrekte Einrücken der Textblöcke, um die Tabulatoren zu berücksichtigen.
Das Spannende an der ganzen Prozedur sind eben die Filter, bzw. die Suchkriterien für die im Post enthaltenen BBCodes. Da wird vornehmlich auf Start- und End-Tag geprüft, ggf. mit Optionen. Das ist dann nicht einfach, da die Kriterien von preg_replace() schon einiges an Hirnschmalz abverlangen, dafür aber sehr mächtige Werkzeuge darstellen.
Bei den Ersetzungen wird auch immer der gesamte Post auf einmal für jeden BBCode bearbeitet. Daher existiert hier auch für jeden BBCode mit jeder möglichen Option eine eigene Behandlungsroutine. preg_replace() und str_replace() leisten hierzu die ganze Arbeit.
Ersetzt wird der Text gemäß Suchmuster für eben diese beiden Suchbefehle mit den zuvor geladenen und im Array $bbcode_tpl[] abgelegten Vorgaben der bbcode.tpl. Damit ist dann die Formatierung perfekt.
Unter der Funkton prepare_bbcode_template($bbcode_tpl) sind auch nur BBCodes enthalten, die Optionen beinhalten können. Wie eben [color], [size], [url], etc. Diese müssen eben noch etwas "vorbehandelt" werden, damit die Ersetzungen korrekt funktionieren können.
Alle anderen "einfacheren" BBCodes wie
, , , etc. werden direkt ersetzt:
Code: Alles auswählen
// [b] and [/b] for bolding text.
$text = str_replace("[b:$uid]", $bbcode_tpl['b_open'], $text);
Hier werden alle [b:$uid] im Post mit der Zeile ($uid = BBCode-Uid)
Code: Alles auswählen
<!-- BEGIN b_open --><span style="font-weight: bold"><!-- END b_open -->
der bbcode.tpl ersetzt, die ja zuvor beim Laden der bbcode.tpl in das Array $bbcode_tpl[] gepackt wurde. Eben in $bbcode_tpl['b_open'], markiert durch "BEGIN b_open" und "END b_open", abgefragt in der Zeile
Code: Alles auswählen
$tpl = preg_replace('#<!-- BEGIN (.*?) -->(.*?)<!-- END (.*?) -->#', "\n" . '$bbcode_tpls[\'\\1\'] = \'\\2\';', $tpl);
der Funktion load_bbcode_template() in der bbcode.php.
Und dieses Suchmuster kann man ja dann auch noch halbwegs verstehen.
Und das gleiche natürlich dann auch für b_close, bzw. [/b:$uid].
Daher ist die bbcode_uid eben wichtig, um die BBCodes korrekt zu markieren und umwandeln zu können. Also zumindest die "einfachen".
Dabei kann es nicht vorkommen, daß nur der Anfang oder das Ende eines BBCodes codiert wird (im Falle von
wäre dann der restliche Text ja komplett fett dargestellt). Das verhindert das entsprechende Suchmuster beim Aufbereiten des Textes vor dem Speichern in der Funktion bbencode_first_pass($text, $uid), mit der nur korrekt vorhandene BBCodes ersetzt und mit einer bbcode_uid versehen werden:
Code: Alles auswählen
$text = preg_replace("#\[b\](.*?)\[/b\]#si", "[b:$uid]\\1[/b:$uid]", $text);
Hier ist eindeutig zu erkennen, daß [ b ] und [ /b ] vorhanden sein müssen, um mit [ b:$uid ] und [ /b:uid ] (Jeweils ohne Leerzeichen) ersetzt zu werden.
Somit steht dann einer o.g. korrekten Darstellung nichts mehr im Wege.
Jetzt verständlicher?
PS: Zu schaffen machen mit die Suchmuster für preg_match()/preg_replace() vor allem mit dem zig Backslashes "\", Klammern, Sternchen und anderen Parametern, die eben im Test nicht vorkommen dürfen, um Fehlinterpretationen hier zu vermeiden.
Daher streike ich oft, wenn ich einen Suchstring zerlegen oder gar erstellen soll.
Sicher lerne ich das auch irgendwann mal. Möglichst gestern. Aber die sind nunmal sehr komplex, wenn sie kombiniert werden und daher sehr schwer zu erlernen.
Mal schauen, was mein neues PHP-Buch dazu sagt, wenn ich dann endlich mal Zeit habe, da reinzuschauen...