BBCodes des phpBB

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Antworten
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

BBCodes des phpBB

Beitrag von AmigaLink »

Kann mir mal einer grob erklären wie die bbcode.php arbeitet?
Das simple erstellen eines BBCodes für fettschrift, kursiv, unterstreichen oder sogar Schriftfarbe und -größe hab ich ja kapiert. Aber wie zum Teufel erstellt man einen BBCode der übergebene Daten, wie z.B. die Schriftgröße, erstmal verarbeitet? ^1
Irgendwie blicke ich nicht durch wann welche Funktion durchlaufen wird. ^5
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

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...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Vielen vielen dank, das war mehr als ich eigentlich wissen wollte. Bild

Die ganzen preg_match() & preg_replace() machen einem beim lesen des Codes so dermaßen kirre Bild, das es verdammt schwer ist die Arbeitsweise der bbcode.php zu Analysieren. Bild
Und überhaupt finde ich den aufbau des Codes sehr irreführend. ^1

Du hast mir mit dieser Erklärung jetzt eine menge Grübelei erspart Bild, so das ich mich eher mit den preg_match() / preg_replace() / str_replace() befehlen auseinandersetzen kann. ^w
Dummerweise hab ich bisher zu diesen befehlen nur sehr spärliche informationen gefunden, die nicht besonders Hilfreich beim verstehen der befehle sind. :(
Mal schauen, was mein neues PHP-Buch dazu sagt
Kannst du da eins empfehlen?
Ich habe bisher nur dieses hier. Das ist für Einsteiger wirklich sehr gut, geht aber dadurch nur sehr oberflächlich mit komplizierten Befehlen um.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ich habe dieses hier.
Sehr umfangreich und gut beschrieben. Auch gerade der MySQL-Teil.

Und freut mich, wenn ich ganze Knoten lösen konnte.
BTW: Wir sollten mal einen preg_match() -Topic eröffnen. Oder gar ein Forum dazu?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Oha, das Buch ist ja sogar in einer erschwinglichen Preisklasse (direkt mal bestellt hab). :)
BTW: Wir sollten mal einen preg_match() -Topic eröffnen. Oder gar ein Forum dazu?
Ein Forum dazu wäre zwar, angesichts der komplizierten Parameter, angebracht, aber wohl eher ein wenig übertrieben. ;)
Aber wo du es schonmal ansprichst. Ich finde das Forum "Programmierung" geht als Subforum von "Software / Betriebssysteme" stark unter und sollte evtl. etwas höher in der Hierarchie sein. Vielleicht sogar mit Unterforum "PHP" (obwohl das eh der Schwerpunkt hier sein wird). :)
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wohin soll es dann?
Hm..
Oki, wird verschoben.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Wohin soll es dann?
Ich würde sagen als eigenständiges Forum in der "phpBB Helpdesk", wobei ich diese wiederum nur "Helpdesk" nennen würde.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

So, dann können wir jetzt loslegen ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Hab es schon gesehen. ^e

// EDIT
Ähm - ich würde sagen jetzt könnten noch ein paar threads verschoben werden. ;)
War schon selber in versuchung, aber ich kann ja nicht. :)
das Buch ist ja sogar in einer erschwinglichen Preisklasse (direkt mal bestellt hab). :)
Donnerkeil - Das ist aber ein Wälzer. :eek:
Aber nach, bisher nur, grobem überfliegen, genau das, was Papa's Sohn gesucht hat. :D
Zuletzt geändert von AmigaLink am Fr 25.Mär, 2005 12:28, insgesamt 1-mal geändert.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Hehe freut mich, wenn Dir der Wälzer gefällt.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Antworten