Photoshop
Cinema 4d
HTML / CSS
JavaScript
PHP
Flash
Fotografie
Terragen
Webserver
Informatik
Sonstige
BBCode mit Regulären Ausdrücken umwandeln (Php Tutorial)
Tutorial erstellt von Basti in PHP 4/PHP 5, letzte Änderung am 16.06.2008
Der so genannte BB Code (Abk. für Bulletin Board Code) ist ein weit verbreitetes Hilfsmittel im Internet. Er dient der Auszeichnung von Formulareinträgen in diversen Foren und ähnlichen Anwendungen.
Zwar sind die jeweiligen Schreibweisen eng an HTML angelehnt, häufig vereinfachen sie aber auch ihre HTML Entsprechungen. Ein weiterer Vorteil des BB Codes besteht darin, dass unerwünschten Formatierungen vorgebeugt werden kann, da man selbst festlegt, welche Schreibweisen akzeptiert werden.
BB Code wird im Gegensatz zu HTML nicht von Webbrowsern interpretiert, was bedeutet, dass er im Browser einfach als Text angezeigt wird. Damit aber dennoch die vorgesehenen Formatierungen bewirkt werden, muss er zuvor in eine gültige HTML Schreibweise umgewandelt werden.
Dazu bietet sich eine eigene PHP Funktion an, die alle BB Code-Tags in einem gegebenen Text ausfindig macht und durch herkömmliches HTML ersetzt.
BB Code lässt sich im Allgemeinen in zwei Typen unterteilen:
Fangen wir zunächst mit den einfachen Tags an, auch wenn sie streng genommen nicht zum BB Code zählen sondern einfach ebenfalls häufig in Foren zu finden sind.
Als Beispiel soll der Smilie
Code:
dienen.
Diesen möchten wir nun bei der Ausgabe durch eine Smilie-Grafik ersetzen. Behilflich ist uns dabei die PHP Funktion str_replace().
Mit ihr haben wir die Möglichkeit, alle Vorkommen einer gesuchten Zeichenkette (Suchstring) in einem Text durch eine andere Zeichenkette (Ersatz) zu ersetzen.
Die Parameter der Funktion sehen wie folgt aus:
Code:
In unserem Beispiel ist der Suchstring der Smilie und der Ersatz die Grafik. Der Text sollte selbsterklärend sein. Es darf allerdings nicht vergessen werden, den Rückgabewert der Funktion einer Variable zuzuweisen, da die Umwandlung sonst umsonst war.
Code:
Als Ergebnis erhalten wir diese Ausgabe (die Grafik würde in einem Browser natürlich auch als solche angezeigt):
Code:
Für verschiedene Smilies können einfach mehrere Umwandlungen hintereinander durchgeführt werden:
Code:
Wichtig ist hierbei, dass stets die gleiche Variable verwendet wird, da am Ende ja der komplette Text in umgewandelter Form vorliegen soll.
Die Umwandlung von einfachen Tags ist also schnell und einfach gelöst. Kommen wir jetzt aber zu den Klammer-Tags. Diesmal wird als Beispiel der BB Code
Code:
behandelt (die Leerzeichen dienen nur dem Zweck, eine Umwandlung des BB Codes hier im Tutorial zu verhindern).
Prinzipiell könnte man natürlich wieder die Funktion str_replace() verwenden und den öffnenden und schließenden Tag einzeln umwandeln:
Code:
In diesem Fall würde es auch noch funktionieren. Doch was ist, wenn beispielsweise der schließende Tag vergessen wurde? Dann hätten wir einen HTML Fehler in der Ausgabe, doch niemandem würde es ohne Betrachtung des Quelltextes auffallen, da der öffnende Tag im Browser nicht angezeigt würde.
Des weiteren stößt diese Methode spätestens bei den BB Codes für Links und Grafiken an ihre Grenzen, denn dort können die Tags nicht einzeln ersetzt werden:
Code:
müsste nämlich durch
Code:
ersetzt werden.
Mit str_replace() können wir hier also nicht mehr arbeiten. Deshalb verwenden wir nun die PHP Funktion preg_replace().
Diese ermöglicht uns den Einsatz von Regulären Ausdrücken (auch Regular Expressions bzw. abgekürzt RegExp), mit deren Hilfe man Mengen und Untermengen von Zeichenketten über bestimmte Regeln beschreiben kann.
Das hört sich nun sehr theoretisch an, doch so kompliziert sind Reguläre Ausdrücke in Wirklichkeit gar nicht.
Bevor wir zu den Regulären Ausdrücken kommen, soll noch kurz auf die Funktion preg_replace() eingegangen werden.
Diese arbeitet ähnlich wie str_replace() und besitzt vergleichbare Funktionsparameter:
Code:
Der erste Parameter ist nun jedoch kein einfacher Suchstring mehr, sondern ein Suchmuster, in dem Reguläre Ausdrücke zum Einsatz kommen können.
Das Suchmuster hat einen festen Aufbau, den wir uns einmal genauer ansehen werden:
Code:
Delimiter
Das eigentliche Suchmuster muss immer von zwei Delimitern (Begrenzern) umschlossen werden, welche es vom Rest des Ausdrucks abgrenzen.
Dies ist notwendig, da optional noch so genannte Modifier gesetzt werden können, die vom Suchmuster unterscheidbar sein müssen.
Die verwendeten Delimiter dürfen nicht innerhalb des Suchmusters vorkommen, da sonst das Ende des Suchmusters nicht bestimmt werden kann.
Häufig verwendete Delimiter sind beispielsweise !, #, /, @ oder &.
Suchmuster
Das Suchmuster (Pattern) steht zwischen den beiden Delimitern und kann sich aus mehreren Regulären Ausdrücken zusammensetzen.
Modifier
Die bereits angesprochenen Modifier (Modifikatoren) sind optional und ermöglichen eine zusätzliche Beeinflussung des Verhaltens von Regulären Ausdrücken im Suchmuster.
Ich werde nun nicht alle Grundlagen zu Regulären Ausdrücken erläutern, da dies den Umfang dieses Tutorials sprengen würde, sondern lediglich auf diejenigen eingehen, die für die Umwandlung von BB Code benötigt werden.
Wir greifen nun wieder das erste Beispiel für die Klammer-Tags auf - den BB Code für eine fette Formatierung - und werden diesen mithilfe von preg_match() und Regulären Ausdrücken umwandeln (die Leerzeichen bitte wieder nicht beachten).
Dazu gebe ich zunächst einmal eine mögliche Lösung vor, die im Folgenden erläutert werden soll:
Code:
Das Suchmuster
Der erste Parameter weist den gerade erklärten Aufbau, bestehend aus den zwei Delimitern (#), dem eigentlichen Suchmuster (\[b\](.*)\[/b\]) und drei Modifiern (isU), auf.
Im Suchmuster befinden sich jedoch Reguläre Ausdrücke. Als erstes fallen die Backslashes vor jeder eckigen Klammer auf.
In der Regel werden Zeichenketten in Suchmustern auch als solche geschrieben, bei den eckigen Klammern handelt es sich allerdings um funktionelle Zeichen innerhalb von Regulären Ausdrücken. Sie dienen der Angabe von Zeichenbereichen.
Da sie in diesem Fall aber einfach Bestandteil eines konkreten Suchmusters sind und keine Zeichenbereiche angeben, müssen sie mit Backslashes escaped (entwertet) werden.
Was im umzuwandelnden Text zwischen den beiden BB Code-Tags steht, ist im Voraus nicht bekannt, weshalb nun Reguläre Ausdrücke zum Einsatz kommen. Im Beispiel ist dies ein Punkt mit einem Stern, welche von zwei runden Klammern umgeben werden.
Der Punkt gibt ähnlich wie die angesprochenen eckigen Klammern einen Zeichenbereich an. Er ist die Kurzschreibweise für beliebige Zeichen, also Buchstaben, Ziffern, Sonderzeichen etc..
Wir setzen ihn hier ein, da zwischen den BB Code-Tags für eine fette Formatierung alle Zeichen möglich sein sollen.
Ein einzelner Punkt würde jedoch nur zur Beschreibung eines einzelnen Zeichens ausreichen, doch zwischen den BB Code-Tags soll ja auch mehr als ein Zeichen vorkommen dürfen.
Deshalb kommt ein so genannter Quantifier (Quantifikator) zum Einsatz, in diesem Fall der Stern. Zwar ist die Länge des eingeschlossenen Strings ebenfalls nicht bekannt, sie darf aber beliebig sein. Dies drückt der Stern aus, der für eine beliebige Wiederholung der zuvor notierten Zeichenmenge, also dem Metazeichen Punkt, steht.
Zwischen den BB Code-Tags können nun also beliebige Zeichen in beliebiger Anzahl stehen.
Irgendwie muss diese Zeichenkette nun aber "zwischengespeichert" werden, da sie ja im umgewandelten Suchmuster wieder eingefügt werden soll.
Zu diesem Zweck wird der entsprechende Teil des Suchmusters mithilfe von runden Klammern gruppiert. Über Backreferences können solche Gruppierungen dann im Ersatz wieder eingefügt werden.
Die Backreferences werden in PHP durch ganzzahlige Variablen angesprochen, welche beginnend mit $1 für die erste Gruppierung in 1er-Schritten für jede weitere Gruppierung fortgeführt werden.
In unserem Ersatz befindet sich zwischen den beiden HTML-Tags deshalb die Variable $1, da es sich bei dem zu übernehmenden Teil um die erste Gruppierung im Suchmuster handelt.
Als letztes fehlen noch die Modifier. Im Beispiel kamen i, s und U zum Einsatz.
i bewirkt, dass Buchstaben im Suchmuster sowohl auf klein- als auch großgeschriebene Buchstaben passen. Das bedeutet, dass bei der Umwandlung [ b ][/ b ] und [ B ][/ B ] akzeptiert werden, was sinnvoll ist, da die Benutzer nicht immer nur die kleingeschriebene Variante verwenden.
Ist s gesetzt, so passt das Metazeichen Punkt, welches in unserem Suchmuster zum Einsatz kommt, zusätzlich auf Zeilenumbrüche. Dies ist wichtig, da der BB Code-Tag sich unter Umständen auch über mehrere Zeilen erstreckt.
U kehrt die Gier von Quantifiern um, sodass sie nicht mehr gierig sind. Das hört sich wieder einmal sehr abstrus an, doch es lässt sich leicht erklären:
Code:
würde ohne den Modifier U zu
Code:
umgewandelt werden, da der Stern "gierig" ist und möglichst viele Zeichen bis zum End-Tag haben möchte. Dadurch werden bei mehreren solcher Tags alle End-Tags in der Mitte übersprungen.
Deshalb setzen wir U ein, um folgendes Ergebnis zu erhalten:
Code:
Hiermit sind die wichtigsten Grundlagen für unsere Umwandlungen schon gelegt. Alle anderen Klammer-Tags lassen sich ähnlich umsetzen.
Da es jedoch umständlich wäre, alle Umwandlungen immer wieder neu zu notieren, legen wir nun eine eigene PHP Funktion an, die automatisch in einem übergebenen String alle Vorkommen von BB Codes umwandeln soll.
Code:
Die Funktion htmlentities() verwenden wir, um HTML Codes zu maskieren, da diese ja keine Formatierungen mehr bewirken sollen. Alternativ könnte auch die Funktion stripslashes() eingesetzt werden, mit dem Unterschied, dass enthaltene HTML Tags dann ganz aus der übergebenen Zeichenkette entfernt werden.
Für die Smilies wird nach wie vor die Funktion str_replace() verwendet, weil Reguläre Ausdrücke hierbei nicht benötigt werden und nur mehr Rechenaufwand bedeuten würden.
Bei einigen BB Codes kommen mehrere Gruppierungen zum Einsatz, was sich in den Backreferences bis $2 äußert.
Ansonsten sind aber alle Suchmuster ähnlich wie in dem erläuterten Beispiel für eine fette Formatierung.
Einzig bei der Schriftgröße und den zusätlichen Listen kommt das Pipe-Zeichen ("|") hinzu, welches in Regulären Ausdrücken die Funktion eines logisches Oders besitzt, vergleichbar also mit dem doppelten Pipe-Zeichen ("||") in PHP.
Auf diese Weise haben wir die Möglichkeit, innerhalb des gruppierten Bereiches nur bestimmte Schriftgrößen bzw. Listentypen zu erlauben, in diesem Beispiel 8, 10 oder 12pt bzw. 1 oder a. Die entsprechende Backreference nimmt automatisch den zutreffenden Wert an, sodass es dort zu keinen Änderungen in der Schreibweise kommt.
Die Funktion kann man nun in einer Funktionssammlung oder bei Bedarf in einer separaten Datei abspeichern, damit sie immer dort wo sie benötigt wird eingebunden werden kann.
Über einen einfachen Funktionsaufruf wird dann der BB Code automatisch umgewandelt:
Code:
Die Funktion selbst ist natürlich noch lange nicht perfekt, sie soll lediglich die Grundgedanken zur Umwandlung der gängigen BB Code-Tags zeigen.
Wer sich noch näher mit Regulären Ausdrücken auseinandersetzen möchte, könnte beispielsweise bei der Schriftfarbe anstatt eines Punktes eine konkrete Zeichenmenge angeben, sodass nur noch gültige Farbnamen, Hexadezimalzahlen oder RGB Angaben akzeptiert werden.
Ähnliches gilt auch für die Umwandlung von Links. Derzeit würden selbst ungültige Links akzeptiert, sodass man z.B. festlegen könnte, dass die Links mit http:// oder ähnlichem beginnen müssen.
Es lässt sich also noch einiges verbessern. Gute Erklärungen rund um Reguläre Ausdrücke in PHP finden sich auf der Seite RegExp-Evaluator. Dort habt ihr auch die Möglichkeit, eure Ausdrücke von einem Evaluator auf Richtigkeit überprüfen zu lassen.
Des weiteren findet ihr in der PHP Manual eine Auflistung aller Suchmuster-Modifikatoren, die in PHP Funktionen wie preg_replace() verwendet werden können.
Wer seinen Besuchern die Formatierung von Formulareinträgen mit BB Code durch entsprechende Buttons und JavaScript erleichtern möchte, sollte sich das entsprechende Tutorial Textfeld mit BBCodes ausstatten von Ingo ansehen.
Damit sind wir auch schon wieder am Ende des Tutorials. Ich hoffe diese grundlegende Einführung in den Einsatz von Regulären Ausdrücken bei der Umwandlung von BB Code war gut verständlich und hilfreich für den Einstieg in kompliziertere Anwendungsbereiche.
Bei Fragen stehe ich natürlich gerne im Forum zur Verfügung.
euer Basti
www.sf-design.info
>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!
Zwar sind die jeweiligen Schreibweisen eng an HTML angelehnt, häufig vereinfachen sie aber auch ihre HTML Entsprechungen. Ein weiterer Vorteil des BB Codes besteht darin, dass unerwünschten Formatierungen vorgebeugt werden kann, da man selbst festlegt, welche Schreibweisen akzeptiert werden.
Einführung
BB Code wird im Gegensatz zu HTML nicht von Webbrowsern interpretiert, was bedeutet, dass er im Browser einfach als Text angezeigt wird. Damit aber dennoch die vorgesehenen Formatierungen bewirkt werden, muss er zuvor in eine gültige HTML Schreibweise umgewandelt werden.
Dazu bietet sich eine eigene PHP Funktion an, die alle BB Code-Tags in einem gegebenen Text ausfindig macht und durch herkömmliches HTML ersetzt.
BB Code lässt sich im Allgemeinen in zwei Typen unterteilen:
- einfache Tags (Smilies, spezielle Zeichen; eher selten)
- Klammer-Tags (Standardformatierungen, Links, Grafiken; fast immer)
einfache Tags
Fangen wir zunächst mit den einfachen Tags an, auch wenn sie streng genommen nicht zum BB Code zählen sondern einfach ebenfalls häufig in Foren zu finden sind.
Als Beispiel soll der Smilie
Code:
:)
dienen.
Die Funktion str_replace()
Diesen möchten wir nun bei der Ausgabe durch eine Smilie-Grafik ersetzen. Behilflich ist uns dabei die PHP Funktion str_replace().
Mit ihr haben wir die Möglichkeit, alle Vorkommen einer gesuchten Zeichenkette (Suchstring) in einem Text durch eine andere Zeichenkette (Ersatz) zu ersetzen.
Die Parameter der Funktion sehen wie folgt aus:
Code:
str_replace($Suchstring, $Ersatz, $Text)
In unserem Beispiel ist der Suchstring der Smilie und der Ersatz die Grafik. Der Text sollte selbsterklärend sein. Es darf allerdings nicht vergessen werden, den Rückgabewert der Funktion einer Variable zuzuweisen, da die Umwandlung sonst umsonst war.
Code:
$nachricht = 'Heute ist ein schöner Tag! :)';
$umwandlung = str_replace(':)', '<img src="smile.gif" />', $nachricht);
echo $umwandlung;
$umwandlung = str_replace(':)', '<img src="smile.gif" />', $nachricht);
echo $umwandlung;
Als Ergebnis erhalten wir diese Ausgabe (die Grafik würde in einem Browser natürlich auch als solche angezeigt):
Code:
Heute ist ein schöner Tag! <img src="smile.gif" />
Für verschiedene Smilies können einfach mehrere Umwandlungen hintereinander durchgeführt werden:
Code:
$nachricht = 'Heute ist ein schöner Tag! :) Deshalb haben wir viel Spaß. :mr_green:';
$umwandlung = str_replace(':)', '<img src="smile.gif" />', $nachricht);
$umwandlung = str_replace(':mr_green:', '<img src="mr_green.gif" />', $nachricht);
echo $umwandlung;
$umwandlung = str_replace(':)', '<img src="smile.gif" />', $nachricht);
$umwandlung = str_replace(':mr_green:', '<img src="mr_green.gif" />', $nachricht);
echo $umwandlung;
Wichtig ist hierbei, dass stets die gleiche Variable verwendet wird, da am Ende ja der komplette Text in umgewandelter Form vorliegen soll.
Klammer-Tags
Die Umwandlung von einfachen Tags ist also schnell und einfach gelöst. Kommen wir jetzt aber zu den Klammer-Tags. Diesmal wird als Beispiel der BB Code
Code:
[ b ][/ b ]
behandelt (die Leerzeichen dienen nur dem Zweck, eine Umwandlung des BB Codes hier im Tutorial zu verhindern).
Prinzipiell könnte man natürlich wieder die Funktion str_replace() verwenden und den öffnenden und schließenden Tag einzeln umwandeln:
Code:
$nachricht = '[ b ]fetter Text[/ b ]';
$umwandlung = str_replace('[ b]', '<b>', $nachricht);
$umwandlung = str_replace('[/b]', '</b>', $nachricht);
echo $umwandlung;
$umwandlung = str_replace('[ b]', '<b>', $nachricht);
$umwandlung = str_replace('[/b]', '</b>', $nachricht);
echo $umwandlung;
In diesem Fall würde es auch noch funktionieren. Doch was ist, wenn beispielsweise der schließende Tag vergessen wurde? Dann hätten wir einen HTML Fehler in der Ausgabe, doch niemandem würde es ohne Betrachtung des Quelltextes auffallen, da der öffnende Tag im Browser nicht angezeigt würde.
Des weiteren stößt diese Methode spätestens bei den BB Codes für Links und Grafiken an ihre Grenzen, denn dort können die Tags nicht einzeln ersetzt werden:
Code:
[ url ]www.der-webdesigner.net[/ url ]
müsste nämlich durch
Code:
<a href="www.der-webdesigner.net">www.der-webdesigner.net</a>
ersetzt werden.
Mit str_replace() können wir hier also nicht mehr arbeiten. Deshalb verwenden wir nun die PHP Funktion preg_replace().
Diese ermöglicht uns den Einsatz von Regulären Ausdrücken (auch Regular Expressions bzw. abgekürzt RegExp), mit deren Hilfe man Mengen und Untermengen von Zeichenketten über bestimmte Regeln beschreiben kann.
Das hört sich nun sehr theoretisch an, doch so kompliziert sind Reguläre Ausdrücke in Wirklichkeit gar nicht.
Die Funktion preg_replace()
Bevor wir zu den Regulären Ausdrücken kommen, soll noch kurz auf die Funktion preg_replace() eingegangen werden.
Diese arbeitet ähnlich wie str_replace() und besitzt vergleichbare Funktionsparameter:
Code:
preg_replace($Suchmuster, $Ersatz, $Text)
Der erste Parameter ist nun jedoch kein einfacher Suchstring mehr, sondern ein Suchmuster, in dem Reguläre Ausdrücke zum Einsatz kommen können.
Aufbau des Suchmusters
Das Suchmuster hat einen festen Aufbau, den wir uns einmal genauer ansehen werden:
Code:
DELIMITER SUCHMUSTER DELIMITER (MODIFIER)
Delimiter
Das eigentliche Suchmuster muss immer von zwei Delimitern (Begrenzern) umschlossen werden, welche es vom Rest des Ausdrucks abgrenzen.
Dies ist notwendig, da optional noch so genannte Modifier gesetzt werden können, die vom Suchmuster unterscheidbar sein müssen.
Die verwendeten Delimiter dürfen nicht innerhalb des Suchmusters vorkommen, da sonst das Ende des Suchmusters nicht bestimmt werden kann.
Häufig verwendete Delimiter sind beispielsweise !, #, /, @ oder &.
Suchmuster
Das Suchmuster (Pattern) steht zwischen den beiden Delimitern und kann sich aus mehreren Regulären Ausdrücken zusammensetzen.
Modifier
Die bereits angesprochenen Modifier (Modifikatoren) sind optional und ermöglichen eine zusätzliche Beeinflussung des Verhaltens von Regulären Ausdrücken im Suchmuster.
Reguläre Ausdrücke
Ich werde nun nicht alle Grundlagen zu Regulären Ausdrücken erläutern, da dies den Umfang dieses Tutorials sprengen würde, sondern lediglich auf diejenigen eingehen, die für die Umwandlung von BB Code benötigt werden.
Wir greifen nun wieder das erste Beispiel für die Klammer-Tags auf - den BB Code für eine fette Formatierung - und werden diesen mithilfe von preg_match() und Regulären Ausdrücken umwandeln (die Leerzeichen bitte wieder nicht beachten).
Dazu gebe ich zunächst einmal eine mögliche Lösung vor, die im Folgenden erläutert werden soll:
Code:
$nachricht = '[ b ]fetter Text[/ b ]';
$umwandlung = preg_replace('#\[b\](.*)\[/b\]#isU', "<b>$1</b>", $nachricht);
echo $umwandlung;
$umwandlung = preg_replace('#\[b\](.*)\[/b\]#isU', "<b>$1</b>", $nachricht);
echo $umwandlung;
Das Suchmuster
Der erste Parameter weist den gerade erklärten Aufbau, bestehend aus den zwei Delimitern (#), dem eigentlichen Suchmuster (\[b\](.*)\[/b\]) und drei Modifiern (isU), auf.
Im Suchmuster befinden sich jedoch Reguläre Ausdrücke. Als erstes fallen die Backslashes vor jeder eckigen Klammer auf.
In der Regel werden Zeichenketten in Suchmustern auch als solche geschrieben, bei den eckigen Klammern handelt es sich allerdings um funktionelle Zeichen innerhalb von Regulären Ausdrücken. Sie dienen der Angabe von Zeichenbereichen.
Da sie in diesem Fall aber einfach Bestandteil eines konkreten Suchmusters sind und keine Zeichenbereiche angeben, müssen sie mit Backslashes escaped (entwertet) werden.
Was im umzuwandelnden Text zwischen den beiden BB Code-Tags steht, ist im Voraus nicht bekannt, weshalb nun Reguläre Ausdrücke zum Einsatz kommen. Im Beispiel ist dies ein Punkt mit einem Stern, welche von zwei runden Klammern umgeben werden.
Der Punkt gibt ähnlich wie die angesprochenen eckigen Klammern einen Zeichenbereich an. Er ist die Kurzschreibweise für beliebige Zeichen, also Buchstaben, Ziffern, Sonderzeichen etc..
Wir setzen ihn hier ein, da zwischen den BB Code-Tags für eine fette Formatierung alle Zeichen möglich sein sollen.
Ein einzelner Punkt würde jedoch nur zur Beschreibung eines einzelnen Zeichens ausreichen, doch zwischen den BB Code-Tags soll ja auch mehr als ein Zeichen vorkommen dürfen.
Deshalb kommt ein so genannter Quantifier (Quantifikator) zum Einsatz, in diesem Fall der Stern. Zwar ist die Länge des eingeschlossenen Strings ebenfalls nicht bekannt, sie darf aber beliebig sein. Dies drückt der Stern aus, der für eine beliebige Wiederholung der zuvor notierten Zeichenmenge, also dem Metazeichen Punkt, steht.
Zwischen den BB Code-Tags können nun also beliebige Zeichen in beliebiger Anzahl stehen.
Irgendwie muss diese Zeichenkette nun aber "zwischengespeichert" werden, da sie ja im umgewandelten Suchmuster wieder eingefügt werden soll.
Zu diesem Zweck wird der entsprechende Teil des Suchmusters mithilfe von runden Klammern gruppiert. Über Backreferences können solche Gruppierungen dann im Ersatz wieder eingefügt werden.
Die Backreferences werden in PHP durch ganzzahlige Variablen angesprochen, welche beginnend mit $1 für die erste Gruppierung in 1er-Schritten für jede weitere Gruppierung fortgeführt werden.
In unserem Ersatz befindet sich zwischen den beiden HTML-Tags deshalb die Variable $1, da es sich bei dem zu übernehmenden Teil um die erste Gruppierung im Suchmuster handelt.
Als letztes fehlen noch die Modifier. Im Beispiel kamen i, s und U zum Einsatz.
i bewirkt, dass Buchstaben im Suchmuster sowohl auf klein- als auch großgeschriebene Buchstaben passen. Das bedeutet, dass bei der Umwandlung [ b ][/ b ] und [ B ][/ B ] akzeptiert werden, was sinnvoll ist, da die Benutzer nicht immer nur die kleingeschriebene Variante verwenden.
Ist s gesetzt, so passt das Metazeichen Punkt, welches in unserem Suchmuster zum Einsatz kommt, zusätzlich auf Zeilenumbrüche. Dies ist wichtig, da der BB Code-Tag sich unter Umständen auch über mehrere Zeilen erstreckt.
U kehrt die Gier von Quantifiern um, sodass sie nicht mehr gierig sind. Das hört sich wieder einmal sehr abstrus an, doch es lässt sich leicht erklären:
Code:
[ b ]fetter Text[/ b ] [ b ]zweiter Text[/ b ]
würde ohne den Modifier U zu
Code:
<b>fetter Text[/ b ] [ b ]zweiter Text</b>
umgewandelt werden, da der Stern "gierig" ist und möglichst viele Zeichen bis zum End-Tag haben möchte. Dadurch werden bei mehreren solcher Tags alle End-Tags in der Mitte übersprungen.
Deshalb setzen wir U ein, um folgendes Ergebnis zu erhalten:
Code:
<b>fetter Text</b> <b>zweiter Text</b>
Hiermit sind die wichtigsten Grundlagen für unsere Umwandlungen schon gelegt. Alle anderen Klammer-Tags lassen sich ähnlich umsetzen.
Da es jedoch umständlich wäre, alle Umwandlungen immer wieder neu zu notieren, legen wir nun eine eigene PHP Funktion an, die automatisch in einem übergebenen String alle Vorkommen von BB Codes umwandeln soll.
Code:
<?php
function parse_bbcode($str)
{
# HTML Zeichen maskieren
$str = htmlentities($str);
# Smilies
$str = str_replace(':)', '<img src="smile.gif" />', $str);
$str = str_replace(':lol:', '<img src="lol.gif" />', $str);
$str = str_replace(':cool:', '<img src="cool.gif" />', $str);
$str = str_replace(':thumb:', '<img src="mr_green.gif" />', $str);
$str = str_replace(':eek:', '<img src="eek.gif" />', $str);
# Formatierungen
$str = preg_replace('#\[b\](.*)\[/b\]#isU', "<b>$1</b>", $str);
$str = preg_replace('#\[i\](.*)\[/i\]#isU', "<i>$1</i>", $str);
$str = preg_replace('#\[u\](.*)\[/u\]#isU', "<u>$1</u>", $str);
$str = preg_replace('#\[color=(.*)\](.*)\[/color\]#isU', "<span style=\"color: $1\">$2</span>", $str);
$str = preg_replace('#\[size=(8|10|12)\](.*)\[/size\]#isU', "<span style=\"font-size: $1 pt\">$2</span>", $str);
# Links
$str = preg_replace('#\[url\](.*)\[/url\]#isU', "<a href=\"$1\">$1</a>", $str);
$str = preg_replace('#\[ url=(.*)\](.*)\[/url\]#isU', "<a href=\"$1\">$2</a>", $str);
# Grafiken
$str = preg_replace('#\[img\](.*)\[/img\]#isU', "<img src=\"$1\" alt=\"$1\" />", $str);
# Zitate
$str = preg_replace('#\[quote\](.*)\[/quote\]#isU', "<div class=\"zitat\">$1</div>", $str);
# Quelltext
$str = preg_replace('#\[code\](.*)\[/code\]#isU', "<div class=\"code\">$1</div>", $str);
# Listen
$str = preg_replace('#\[list\](.*)\[/list\]#isU', "<ul>$1</ul>", $str);
$str = preg_replace('#\[list=(1|a)\](.*)\[/list\]#isU', "<ol type="\"$1\">$2</ol>", $str);
$str = preg_replace("#\[*\](.*)\\r\\n#U", "<li>$1</li>", $str);
return $str;
}
?>
function parse_bbcode($str)
{
# HTML Zeichen maskieren
$str = htmlentities($str);
# Smilies
$str = str_replace(':)', '<img src="smile.gif" />', $str);
$str = str_replace(':lol:', '<img src="lol.gif" />', $str);
$str = str_replace(':cool:', '<img src="cool.gif" />', $str);
$str = str_replace(':thumb:', '<img src="mr_green.gif" />', $str);
$str = str_replace(':eek:', '<img src="eek.gif" />', $str);
# Formatierungen
$str = preg_replace('#\[b\](.*)\[/b\]#isU', "<b>$1</b>", $str);
$str = preg_replace('#\[i\](.*)\[/i\]#isU', "<i>$1</i>", $str);
$str = preg_replace('#\[u\](.*)\[/u\]#isU', "<u>$1</u>", $str);
$str = preg_replace('#\[color=(.*)\](.*)\[/color\]#isU', "<span style=\"color: $1\">$2</span>", $str);
$str = preg_replace('#\[size=(8|10|12)\](.*)\[/size\]#isU', "<span style=\"font-size: $1 pt\">$2</span>", $str);
# Links
$str = preg_replace('#\[url\](.*)\[/url\]#isU', "<a href=\"$1\">$1</a>", $str);
$str = preg_replace('#\[ url=(.*)\](.*)\[/url\]#isU', "<a href=\"$1\">$2</a>", $str);
# Grafiken
$str = preg_replace('#\[img\](.*)\[/img\]#isU', "<img src=\"$1\" alt=\"$1\" />", $str);
# Zitate
$str = preg_replace('#\[quote\](.*)\[/quote\]#isU', "<div class=\"zitat\">$1</div>", $str);
# Quelltext
$str = preg_replace('#\[code\](.*)\[/code\]#isU', "<div class=\"code\">$1</div>", $str);
# Listen
$str = preg_replace('#\[list\](.*)\[/list\]#isU', "<ul>$1</ul>", $str);
$str = preg_replace('#\[list=(1|a)\](.*)\[/list\]#isU', "<ol type="\"$1\">$2</ol>", $str);
$str = preg_replace("#\[*\](.*)\\r\\n#U", "<li>$1</li>", $str);
return $str;
}
?>
Die Funktion htmlentities() verwenden wir, um HTML Codes zu maskieren, da diese ja keine Formatierungen mehr bewirken sollen. Alternativ könnte auch die Funktion stripslashes() eingesetzt werden, mit dem Unterschied, dass enthaltene HTML Tags dann ganz aus der übergebenen Zeichenkette entfernt werden.
Für die Smilies wird nach wie vor die Funktion str_replace() verwendet, weil Reguläre Ausdrücke hierbei nicht benötigt werden und nur mehr Rechenaufwand bedeuten würden.
Bei einigen BB Codes kommen mehrere Gruppierungen zum Einsatz, was sich in den Backreferences bis $2 äußert.
Ansonsten sind aber alle Suchmuster ähnlich wie in dem erläuterten Beispiel für eine fette Formatierung.
Einzig bei der Schriftgröße und den zusätlichen Listen kommt das Pipe-Zeichen ("|") hinzu, welches in Regulären Ausdrücken die Funktion eines logisches Oders besitzt, vergleichbar also mit dem doppelten Pipe-Zeichen ("||") in PHP.
Auf diese Weise haben wir die Möglichkeit, innerhalb des gruppierten Bereiches nur bestimmte Schriftgrößen bzw. Listentypen zu erlauben, in diesem Beispiel 8, 10 oder 12pt bzw. 1 oder a. Die entsprechende Backreference nimmt automatisch den zutreffenden Wert an, sodass es dort zu keinen Änderungen in der Schreibweise kommt.
Die Funktion kann man nun in einer Funktionssammlung oder bei Bedarf in einer separaten Datei abspeichern, damit sie immer dort wo sie benötigt wird eingebunden werden kann.
Über einen einfachen Funktionsaufruf wird dann der BB Code automatisch umgewandelt:
Code:
$nachricht = // ein beliebiger Text;
$umwandlung = parse_bbcode($nachricht);
$umwandlung = parse_bbcode($nachricht);
Die Funktion selbst ist natürlich noch lange nicht perfekt, sie soll lediglich die Grundgedanken zur Umwandlung der gängigen BB Code-Tags zeigen.
Wer sich noch näher mit Regulären Ausdrücken auseinandersetzen möchte, könnte beispielsweise bei der Schriftfarbe anstatt eines Punktes eine konkrete Zeichenmenge angeben, sodass nur noch gültige Farbnamen, Hexadezimalzahlen oder RGB Angaben akzeptiert werden.
Ähnliches gilt auch für die Umwandlung von Links. Derzeit würden selbst ungültige Links akzeptiert, sodass man z.B. festlegen könnte, dass die Links mit http:// oder ähnlichem beginnen müssen.
Es lässt sich also noch einiges verbessern. Gute Erklärungen rund um Reguläre Ausdrücke in PHP finden sich auf der Seite RegExp-Evaluator. Dort habt ihr auch die Möglichkeit, eure Ausdrücke von einem Evaluator auf Richtigkeit überprüfen zu lassen.
Des weiteren findet ihr in der PHP Manual eine Auflistung aller Suchmuster-Modifikatoren, die in PHP Funktionen wie preg_replace() verwendet werden können.
Wer seinen Besuchern die Formatierung von Formulareinträgen mit BB Code durch entsprechende Buttons und JavaScript erleichtern möchte, sollte sich das entsprechende Tutorial Textfeld mit BBCodes ausstatten von Ingo ansehen.
Damit sind wir auch schon wieder am Ende des Tutorials. Ich hoffe diese grundlegende Einführung in den Einsatz von Regulären Ausdrücken bei der Umwandlung von BB Code war gut verständlich und hilfreich für den Einstieg in kompliziertere Anwendungsbereiche.
Bei Fragen stehe ich natürlich gerne im Forum zur Verfügung.
euer Basti
www.sf-design.info
>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!