BB Code
Autor
Flitze
Klicks 173835
Keywords:
BB Code Tutorial, BBCode, BB-Code, BB Code mit Regex, BB Code erklärt, [php]-Tags, [code]-Tags, [img]-Tags, [url]-Tags, HTML ersetzen, HTML ausschalten, Text formatieren, Smilies ersetzen, Wörter kürzen, Links umwandeln, Links kürzen, Länge prüfen, http direkt umwandeln, www direkt umwandeln
Klicks 173835
Rating für BB Code
8.6 von 10
Bewertungen187
Stand
11.06.2013
8.6 von 10
Bewertungen187
Keywords:
BB Code Tutorial, BBCode, BB-Code, BB Code mit Regex, BB Code erklärt, [php]-Tags, [code]-Tags, [img]-Tags, [url]-Tags, HTML ersetzen, HTML ausschalten, Text formatieren, Smilies ersetzen, Wörter kürzen, Links umwandeln, Links kürzen, Länge prüfen, http direkt umwandeln, www direkt umwandeln
Breadcrumb:
Tutorials » BB Code
BB-Code wird benutzt, um einem User die Möglichkeit zu geben, einen Text zu formatieren. Dabei werden gleich 2 Fliegen mit einer Klappe geschlagen. Zum einen ist BB-Code sehr simpel und kann somit auch von Usern ohne HTML-Kenntnisse - der übliche Internetcafe-User kann kein HTML - benutzt werden und zum anderen kann man verhindern, dass ein User mittels Cross-Scripting die Seite zerstört. In diesem Tutorial werde ich eine auf REGEX basierende Möglichkeit beschreiben, BB-Code zu realisieren.
Dazu habe ich mir folgende Abschnitte überlegt:
1. Grundfunktionen
2. URL's umwandeln
3. Wörter kürzen
4. [IMG ] Tag
5. [QUOTE ] Tag
6. [PHP ] und [VAR ] Tags
7. Smilies
1. Grundfunktionen
[ADSENSE_LINE]In der Regel wird BB-Code in der Form [tag][/tag] in den Text eingefügt und ein Script wandelt die entsprechenden [tag]s dann in gültigen HTML Code um. Hier ein paar Beispiele (in den [tag]s dürfen natürlich keine Leerzeichen stehen):
[ b]Text[ /b] wird zu <b>Text</b> und erzeugt Text
[ i]Text[ /i] wird zu <i>Text</i> und erzeugt Text
[ u]Text[ /u] wird zu <u>Text</u> und erzeugt Text
etwas komplexer gehts auch so:
[ color=#ff0000]Text[ /color] wird zu
<span style="color:#ff0000;">Text<span> und erzeugt
Text
[ EMAIL=Webmaster@mywebsolution.de]Meine Email[ /EMAIL] wird zu
<a href="mailto:Webmaster@mywebsolution.de">Meine Email</a> und erzeugt
Meine Email
Realisieren kann man das mit dem folgenden Code:
PHP:
<?php
$text = preg_replace("/\[b\](.*)\[\/b\]/Usi", "<b>\\1</b>", $text);
$text = preg_replace("/\[i\](.*)\[\/i\]/Usi", "<i>\\1</i>", $text);
$text = preg_replace("/\[u\](.*)\[\/u\]/Usi", "<u>\\1</u>", $text);
$text = preg_replace("/\[color=(.*)\](.*)\[\/color\]/Usi", "<span color=\"\\1\">\\2</span>", $text);
$text = preg_replace("/\[email=(.*)\](.*)\[\/email\]/Usi", "<a href=\"mailto:\\1\">\\2</a>", $text);
?>
$text ist der zu ändernde Text. Die Funktion preg_replace funktioniert folgendermaßen:
$variable = preg_replace (Suchmuster, Ersatz, zu_durchsuchender_Text [, int Limit [, int &Anzahl]] )
$variable
Enthält den neuen Text
Suchmuster
Mittels Regular Expressions (REGEX) aufgebautes Muster
Ersatz
String, der das Suchmuster ersetzen soll
zu_durchsuchender_Text
Der Text, der durchsucht werden soll
int Limit
Maximale Anzahl der Ersetzungen (muss eine Zahl sein)
int &Anzahl
Enthält die Anzahl der vorgenommenen Ersetzungen als Zahl (muss eine Variable sein)
int Limit und int &Anzahl sind optional und für unsere Zwecke unnötig, also beachten wir sie nicht weiter.
PHP:
<?php
$text = preg_replace("/\[b\](.*)\[\/b\]/Usi", "<b>\\1</b>", $text);
/*||| ||||||||||||||||||||| ||||||||| |||||
$variable Suchmuster Ersatz zu_durchsuchender_Text
*/
?>
Zunächst fällt auf, dass die Ergebnisvariable und der zu durchsuchende Text die gleiche Variable sind. Das ist natürlich logisch, da wir ja mehrere Ersetzungen vornehmen und am Ende eine Variable haben wollen, in der auch alle Ersetzungen stehen.
Das Suchmuster ist wie folgt aufgebaut
PHP:
<?php
"/ \[ b \] (.*) \[\/b\] / Usi"
/* | | | | | | | |
| escapte [ | escapte ] | siehe vorher nur mit '/b' | Modifier
| | | |
Delimiter Buchstabe 'b' belibig viele Zeichen Delimiter
*/
?>
Ein Suchmuster ist ein String und steht deshalb in "".
Am Anfang und am Ende stehen sog. Delimiter, in diesem Fall '/'.
Bestimmte Zeichen innerhalb des Musters müssen "maskiert" werden, weil sie eine Sonderbedeutung haben, wenn man das nicht macht. Maskieren tut man mit '\'.
Buchstaben und Zahlen kann man 'normal' einfügen.
(.*) bedeutet, dass beliebige Zeichen '.' beliebig oft '*' vorkommen dürfen.
Die Modifier legen das Verhalten des Suchmusters fest.
U => Ungreedy
s => Whitespaces werden auch als beliebige Zeichen betrachtet
i => Insensitiv, egal ob Groß- oder Kleinschreibung (wichtig für die 'b' ).
Das ist jetzt wirklich gaaanz komprimiert zusammengefasst. Wer früher noch nie etwas von Regex gehört hat, wird das wohl auch nicht nachvollziehen können. In diesem Fall könnt ihr euch z.B. hier informieren.
Dieser Regex findet jetzt alle Konstrukte im Text, die dem Suchmuster entsprechen. Ein solches Konstrukt könnte folgendermaßen aussehen:
[ b]Ein kurzer Text 123*$%&[ /b]
Wichtig dabei ist, dass das Konstrukt mit [ b] beginnt und mit [ /b] endet. Dazwischen kann irgendwas stehen.
Wenn ein entsprechendes Konstrukt gefunden wurde, muss es durch Ersatz ersetzt werden.
PHP:
<?php
"<b> \\1 </b>"
/* | | |
| gefundener Text |
HTML Element <b> HTML Element</b>
*/
?>
Der Ersatz ist ebenfalls ein String und steht deshalb in "".
Mittels \\Zahl kann man auf gefundene Konstrukte zugreifen.
In \\0 steht immer das gesamte Konstrukt und danach, also in \\1 \\2 .., die Konstrukte, die in runden Klammern () stehen.
Beispiel dazu (unter Verwendung des o.g. Suchmusters):
[ b]Ein kurzer Text 123*$%&[ /b]
\\0 => [ b]Ein kurzer Text 123*$%&[ /b]
\\1 => Ein kurzer Text 123*$%&
Im Ersatz greifen wir nur auf \\1 zu, da uns die [b ][ /b] nicht weiter interessieren, denn sie werden durch die HTML-Elemente <b> und </b> ersetzt.
Das Ergebnis ist bekannt:
PHP:
<?php
$text = preg_replace("/\[b\](.*)\[\/b\]/Usi", "<b>\\1</b>", $text);
?>
[ b]Ein kurzer Text 123*$%&[ /b] wird zu
<b>Ein kurzer Text 123*$%&</b> und erzeugt
Ein kurzer Text 123*$%&
Das Beispiel mit der Farbe funktioniert fast genauso. Der einzige Unterschied liegt darin, dass es 2 Klammerpaare gibt. Die erste Klammer enthält die Farbe als Hexzahl oder Farbwert und die zweite den Text, der in der Farbe dargestellt werden soll.
PHP:
<?php
$text = preg_replace("/\[color=(.*)\](.*)\[\/color\]/Usi", "<font color=\"\\1\">\\2</font>", $text);
?>
[ color=#ff0000]Text[ /color] wird zu
<span style="color:#ff0000;">Text<span> und erzeugt
Text
Weiter zur nächsten Seite:
BB Code - URL's umwandeln