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 "
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);
- Weiter: 4. Callback-Funktionen
- Zurück: 2. Definieren von eigenem BBCode