Dokumentation der StringParser_BBCode-Klasse

3. Parserfunktionen

3.1 Aufgabe von Parserfunktionen

BBCode wird verwendet, damit HTML nicht zugelassen werden muss. Wenn jetzt allerdings nur der BBCode ersetzt wird, wird der möglicherweise eingegebene HTML-Code direkt wieder ausgegeben. Beispiel: Es wäre sinnlos, bei einem Text von [b]Hallo<script type="text/javascript">/* tu was ganz böses mit javascript */</script>[/b] nur die BBCodes zu ersetzen und das <script>-Element dennoch direkt wieder auszugeben. Das <script>-Element sollte möglichst so maskiert werden, dass es keinen Schaden anrichten kann. Dies kann man mit der Funktion htmlspecialchars erreichen. Man könnte jetzt htmlspecialchars vor dem Parsen durch die Klasse auf den kompletten Inhalt anwenden. Dann würden allerdings Anführungszeichen auch durch &quot; ersetzt werden und falls Anführungszeichen dann in Attributen (wie z.B. [img alt="Alternativer Text"]) verwendet würden, dann würde die Parserklasse das nicht mehr akzeptieren. Daher bietet die Klasse eine Möglichkeit, Funktionen nur für relevante Textteile aufzurufen. Funktionen, die der Klasse für diesen Zweck bekannt gemacht wurden, heißen Parserfunktionen.

Der Einsatzgebiet von Parserfunktionen beschränkt sich nicht nur auf das Maskieren von HTML-Code, man kann auch andere Dinge erledigen, wie zum Beispiel das Ersetzen von Smilys.

3.2 Relevanz von Inhaltstypen

Die Klasse bietet nicht nur die Möglichkeit, für die Textteile, die kein BBCode sind, Funktionen auszuführen. Die Klasse kann auch, je nach unterschiedlichem Inhaltstypen, unterscheiden Paresrfunktionen aufrufen. Beim registrieren der Parserfunktionen gibt man auch gleich den Inhaltstyp an, für den die Parserfunktion gelten soll. Wenn man beispielsweise einen Code namens [code] definiert, der zur Darstellung von Quelltext verwendet werden soll, will man innerhalb des Blocks natürlich keine Smilys ersetzt haben, HTML-Code soll dagegen natürlich maskiert werden. Im Rest des Textes will man aber Smilys ersetzen.

Die Inhaltstypen spielen auch für die korrekte Verschachtelung des BBCodes eine Rolle. Es wurde bereits erwähnt, dass der Standard-Inhaltstyp, falls noch kein BBCode geöffnet wurde, block ist. Diesen kann man auch ändern. Dazu gibt es die Methode

void setRootContentType (string $content_type);

Diese ruft man wie folgt auf:

$bbcode->setRootContentType ('mein_eigener_typ');

3.3 Registrieren von Parserfunktionen

Parserfunktionen kann man der Klasse über die Methode

void addParser (mixed $type, mixed $parser);

bekannt machen. Der Parameter $type gibt dabei an, für welchen Inhaltstyp der Parser gelten soll, der Parameter $parser gibt an, welche Funktion aufgerufen werden soll. $type kann hierbei einfach eine Zeichenkette sein (ein einziger Typ), es kann aber auch ein Array sein (falls man für mehrere Typen auf einmal registrieren will). Folgendes Beispiel zeigt, wie man Parserfunktionen registrieren kann:

$bbcode->addParser ('block', 'htmlspecialchars');

Hier würde die Funktion htmlspecialchars immer dann aufgerufen werden, wenn ein Text ausgegeben werden soll, der sich in einem Element des Inhaltstyps block befindet.

$bbcode->addParser (array ('block', 'inline'), 'htmlspecialchars');

Dieser Aufruf wäre identisch mit den zwei aufeinderfolgenden Aufrufen:

$bbcode->addParser ('block', 'htmlspecialchars');
$bbcode->addParser ('inline', 'htmlspecialchars');

Man kann nicht nur globale Funktionen als Parserfunktionen registrieren, sondern auch Methoden von Objekten:

$bbcode->addParser ('inhaltstyp', array (&$mein_objekt, 'tuwas'));

Die Klasse würde in diesem Fall $mein_objekt->tuwas ($text) aufrufen. Es ist auch möglich, statische Methoden zu registrieren:

$bbcode->addParser ('inhaltstyp', array ('MeineKlasse', 'tuwas'));

Hier würde die Klasse MeineKlasse::tuwas ($text) aufrufen.

Weiterhin ist es problemlos möglich, mehrere Parserfunktionen für einen Inhaltstyp zu registrieren. Diese werden dann in der Reihenfolge aufgerufen, in der sie registriert wurden:

$bbcode->addParser ('block', 'htmlspecialchars');
$bbcode->addParser ('block', 'nl2br');

Hier würden die Funktionen htmlspecialchars und nl2br für den Inhaltstyp block registriert werden. Wenn ein Text innerhalb eines Elements dieses Inhaltstyps ausgegeben werden soll, so wird er so verarbeitet: $text = htmlspecialchars ($text); $text = nl2br ($text);