Layoutprobleme? - Styleswitcher!
![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 604
| [php] BBCode-Parser mit [noparse]-Tag selbst gemacht Dieses Tutorial zeigt die Programmierung eines eigenen BBCode-Parsers. Grundkenntnisse im Umgang mit Regular Expressions (kurz: RegEx) sind sehr vorteilhaft, um die Funktionsweise nachvollziehen zu können! Inhaltsverzeichnis 1) Einleitung und Bezug 2) Die Ausnahme "[noparse]" 3) Das Kernstück: Der Reguläre Ausdruck (RegEx) 4) Die Parameter-Zeichenkette nutzbar machen 5) Umstellen der Callback-Funktion 6) Ein paar einfache Beispiele 6.1) Beispiel: Fett, kursiv und unterstrichen 6.2) Beispiel: URLs 7) Die Verwendung optionaler Parameter 8) Nicht existierende BBCodes im Text belassen 9) BBCodes ohne Close-Tag 10) Zusammenfassung 11) Abschließende Worte 1) Einleitung und Bezug (Zurück zum Inhaltsverzeichnis) Als Basis für dieses Tutorial benutze ich das Beispiel von php.net: PHP-Code: 2) Die Ausnahme "[noparse]" (Zurück zum Inhaltsverzeichnis) Es wird eine Art "Ausnahme" im Script geben undzwar den Tag [noparse]. Dieser dient dazu, alle in ihm enthaltenen BBCode-Elemente nicht zu übersetzen! Der Vorteil ist schlicht und ergreifend der: Sollte man - aus welchen Gründen auch immer - BBCodes im Text als Text selbst anzeigen wollen, umschließt man ihn schlichtweg mit dem [noparse]-Tag: Code: [b]Dieser Text wird fett![/b] Code: Dieser Text wird fett! Code: [noparse][b]Dieser Text wird nicht fett.[/b][/noparse] Code: [b]Dieser Text wird nicht fett.[/b] 3) Das Kernstück: Der Reguläre Ausdruck (RegEx) (Zurück zum Inhaltsverzeichnis) Als nächstes werde ich den RegEx umschreiben, sodass er nicht nur den BBCode "indent" abarbeitet, sondern alle BBCodes findet, die sich in einem Text befinden: Code: °\[(\w+)]((?:[^[]|\[(?!/?\1])|(?R))+)\[/\1]° Die Suchergebnisse für den RegEx sind nun also der BBCode selbst an der Position 1 (z.B. "b") und der Inhalt des BBCodes an der Position 2 (z.B. "Dies ist einer fetter Text"). Soweit, so gut, wir wollen aber noch eventuell Parameter mit übergeben, was z.B. bei dem URL-Tag praktisch ist (z.B. "Name des Links"). Entsprechend muss der RegEx erweitert werden: Code: °\[(\w+)((?:\s|=)[^]]*)?]((?:[^[]|\[(?!/?\1])|(?R))+)\[/\1]° 4) Die Parameter-Zeichenkette nutzbar machen (Zurück zum Inhaltsverzeichnis) Um die Parameter auch vernünftig benutzen zu können, füge ich folgende Funktion hinzu, die die Parameter-Zeichenkette analysiert und ein Array daraus generiert: PHP-Code: Code: Array
(
[__INIT__] => http://www.domain.tld
[0] => http://www.domain.tld
[title] => Link-Titel
[1] => Link-Titel
) 5) Umstellen der Callback-Funktion (Zurück zum Inhaltsverzeichnis) Als Nächstes stelle ich die Struktur der Funktion etwas um: PHP-Code: Sollte der BBCode "noparse" sein, so wird der Text innerhalb dieser Klammer nicht weiter abgearbeitet. Dort, wo der Kommentar zu sehen ist, werde ich später die Verarbeitung der BBCodes vornehmen. 6) Ein paar einfache Beispiele (Zurück zum Inhaltsverzeichnis) Nun werde ich ein paar einfache Beispiele anbringen, wie man verschiedene BBCodes umsetzen kann. Eingesetzt werden muss folgender Code an der Kommentierten Stelle im Script oben. 6.1) Beispiel: Fett, kursiv und unterstrichen (Zurück zum Inhaltsverzeichnis) PHP-Code: 6.2) Beispiel: URLs (Zurück zum Inhaltsverzeichnis) Leider sind nicht alle BBCodes so einfach und bedürfen daher etwas mehr Code, um angemessen zu funktionieren. Deshalb hier ein Beispiel für den URL-BBCode (ACHTUNG: Die URL selber wird in diesem Beispiel nicht auf korrekte Schreibweise geprüft, um das Beispiel nicht komplizierter zu machen, als es zwingend nötig ist!) : PHP-Code: 7) Die Verwendung optionaler Parameter (Zurück zum Inhaltsverzeichnis) Optional könnte man zum Beispiel auch noch eine Möglichkeit einbauen, den TITLE-Parameter übersetzen zu lassen (z.B. "[url=http://www.domain.tld title="Dies ist der Titel des Links"]Link-Text[/url]") : PHP-Code: 8) Nicht existierende BBCodes im Text belassen (Zurück zum Inhaltsverzeichnis) Bislang ist es so, dass alle BBCodes, die nicht verarbeitet werden, schlichtweg gelöscht werden. Sollte man dieses nicht wollen, reicht folgender default-Case: PHP-Code: 9) BBCodes ohne Close-Tag (Zurück zum Inhaltsverzeichnis) Ein kleines Problem gibt es aber noch: Es kann BBCodes geben, die keinen Close-Tag haben. Sollte man jemals solche BBCodes haben wollen (z.B. "[br]", "", etc.), muss man vor dem Ersetzen diese Codes noch um einen Close-Tag erweitern. Das geht zum Beispiel mit einem einfachen preg_replace (): PHP-Code: 10) Zusammenfassung (Zurück zum Inhaltsverzeichnis) Im Grunde bin ich kein Freund davon, fertige Scripte zum Download anzubieten, da ich selber die Gefahr sehe, dass dann das Tutorial nicht (oder zumindest nicht richtig) gelesen wird, das Script stumpf kopiert wird und bei Fehlern oder Problemen unnötige Fragen gestellt werden, die sich durch das Lesen des Tutorials erübrigen würden. Dennoch habe ich mich dazu entschlossen den Code zu diesem Script als Datei mit anzubieten. Ich habe allerdings eine Bitte: Bei Problemen und Fehlern bitte erst das Tutorial lesen. Sollte das Problem oder der Fehler nicht beschrieben oder nicht verständlich genug sein, sind Fragen natürlich erwünscht! Grundsätzlich ist das Script natürlich nicht vollständig, sondern beinhaltet lediglich die in diesem Tutorial angesprochenen Funktionen bzw. BBCodes. Einzig der CASE für [br]- und [hr]-Tags ist hinzugekommen (Diese wurden als Beispiele für BBCodes ohne Close-Tag angesprochen und sind nur aus diesem Grund eingefügt worden). Zusätzlich hänge ich noch eine Datei an, die ein Beispielscript enthält, mit dem man die Funktionsweise des Scriptes überprüfen kann. Die Dateien enthalten keine Kommentare, da sich die Funktionsweise aus dem Tutorial selbst ergibt. 11) Abschließende Worte (Zurück zum Inhaltsverzeichnis) An dieser Stelle endet dieses kleine Tutorial. Ich hoffe, dass ich - auch wenn ein bisschen Grundwissen in RegEx vorausgesetzt wird - einigermaßen anschaulich erklären konnte, wie man mit Hilfe von RegEx' einen vernünftigen BBCode-Parser bauen kann. Die Art und Weise, wie die Codes ersetzt werden bleibt natürlich jedem selbst überlassen, aufgrund der Fülle möglicher Template-Engines habe ich jedoch darauf verzichtet eine derartige Schnittstelle zu verwenden. Jeder, der gerne seine TE dazu benutzen möchte, die Inhalte in formatiertes HTML zu pressen, möge sich mit der TE seiner Wahl näher auseinander setzen und die Schnittstelle dazu entsprechend selber programmieren. Ich weise an dieser Stelle noch ein Mal darauf hin, dass ich in meinen Beispielen die Inhalte nicht geprüft habe (das gilt vor Allem für die Parameter!) und dass entsprechende Sicherheitsvorkehrungen von Jedem selbst zu implementieren sind! Sollten noch Fragen auftauchen, so bin ich gerne bereit meine Hilfe anzubieten, ebenso bin ich für Verbesserungsvorschläge und / oder Kritik (aber bitte nur konstruktive!) offen und dankbar! Geändert von MrNiceGuy (27.04.2008 um 16:44 Uhr). |
| | |
| | Nach oben #2 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 604
| Aufgrund dieser Frage wurde ein Fehler im RegEx behoben. Geändert von Jann Hendrik (27.04.2008 um 12:14 Uhr). |
| | |
![]() |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [PHP] vCard PHP Parser | Jann Hendrik | Tutorials | 0 | 22.08.2007 10:24 |
| [Java] Parser Generierung mit JavaCC - Eine Einführung | pago | Tutorials | 0 | 14.04.2006 11:54 |
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:31 Uhr.
Nach oben






