17 HTML
Es liegt in der Natur der Sache, dass PHP primär zum Generieren von Webseiten verwendet wird. Daher ist in PEAR eine recht stattliche Anzahl von Paketen vorgesehen, um Sie beim Umgang mit HTML zu unterstützen.
Die meisten der HTML-Pakete basieren auf dem Paket HTML_Common. Da dieses Paket nur dann sinnvoll einzusetzen ist, wenn man selbst PEAR_HTML-Pakete entwickelt, erläutere ich es hier nicht weiter. Einen Punkt möchte ich allerdings aufgreifen. Die Pakete verwenden fast alle HTML_Common, um Attribute von HTML-Tags zu verwalten. Rufen Sie eine Methode auf, der Sie Attribute für ein Tag übergeben können, so können Sie die Attribute immer als String oder als Array übergeben. Die beiden folgenden Aufrufe sind als äquivalent:
$obj->methode('width="100 %", border="1"'); $obj->methode(array ( 'width'=>'100 %', 'border'='1' ));
17.1 HTML_BBCodeParser 

Besprochene Version: 1.1 | Lizenz: PHP-Lizenz |
Klassendatei(en): HTML/BBCodeParser.php |
Wenn Sie ein Gästebuch oder ein Forum programmieren möchten, stehen Sie immer wieder vor demselben Problem. Benutzer, die Sie nicht kennen, können freien Text eingeben, der später in einem Browser dargestellt wird. Grundsätzlich ist das ja nichts Schlimmes und auch das Ziel eines Gästebuchs. Allerdings könnte ein Benutzer z. B. auch so etwas eingeben:
In diesem Fall würde bei jedem Aufruf des Gästebuchs ein Fenster erscheinen, in dem »Ihr Rechner wurde gehackt« steht. Das ist nicht wirklich schön, wenn Sie das Gästebuch für einen Firmenkunden erstellt haben. Allerdings ist das noch ein harmloses Beispiel. Man kann dort auch deutlich unangenehmere Sachen machen. Natürlich könnten Sie die Daten jetzt einfach mit strip_tags() oder htmlspecialchars() bearbeiten, was allerdings den Nachteil mit sich bringt, dass die User Ihren Text nicht verschönern oder Links einbauen können.
Ein möglicher Ausweg ist die Nutzung von BBCode. BBCode ist die Abkürzung für »Bulletin Board Code«. Hierbei handelt es sich um einen Code, der stark an HTML angelehnt ist, wobei die Kleiner-als- und Größer-als-Zeichen üblicherweise durch eckige Klammern ersetzt werden. Das bietet den Vorteil, dass Sie etwaige HTML-Codes einfach herausfiltern oder mit htmlspecialchars() konvertieren können. Wenn das geschehen ist, können Sie die BBCodes nach HTML konvertieren. Somit können Sie sicher sein, dass kein unerlaubter Code eingeschleust wird, und der Benutzer hat gleichzeitig die Möglichkeit, seine Eingaben mit HTML zu gestalten.
Die Nutzung des Pakets ist erfreulich unproblematisch, wie Sie in Listing 17.1 sehen können.
require_once('HTML/BBCodeParser.php'); // Dieser Text wuerde normalerweise aus einem Formular kommen $text="Dies ist ein [b]fetter[/b] Text"; // Neuen Parser instanziieren $bbparser = new HTML_BBCodeParser(); // Fehler aufgetreten? if (true===PEAR::isError($bbparser)) { die ($bbparser->getMessage()); } $bbparser->setText($text); $bbparser->parse(); $bbparsed = $bbparser->getParsed(); echo $bbparsed; // Ausgabe: Dies ist ein <strong>fetter</strong> Text
Listing 17.1 Konvertieren von BBCodes
Der Konstruktor benötigt keinen Parameter, obgleich er einen akzeptiert, wie Sie gleich sehen werden. Wichtig ist allerdings, dass Sie seinen Rückgabewert auf einen Fehler prüfen. Da er direkt Dateien einbindet, könnte es hier natürlich immer mal zu Problemen kommen.
Den zu parsenden Text übergeben Sie mit der Methode setText(), die ihn direkt im Objekt ablegt. Sollte hier schon ein Text enthalten sein, wird dieser überschrieben. Für das Übersetzen der Codes von BB- nach HTML-Code ist die Methode parse() zuständig.
Um die konvertierten Daten wieder aus dem Objekt auszulesen, steht getParsed() zur Verfügung.
Diese Vorgehensweise ist recht transparent und bietet den Vorteil, dass die einzelnen Schritte gut nachvollziehbar sind. Sollten Ihnen diese drei Einzelschritte zu langwierig erscheinen, können Sie auch die Methode qparse() nutzen.
Sie erledigt alle drei Schritte auf einmal.
Wie schon erwähnt, akzeptiert der Konstruktor einen Parameter. Hierbei handelt es sich um ein Array, mit dem das Verhalten des resultierenden Objekts beeinflusst wird. Ein solches Array kann folgenden Aufbau haben:
$options = array( 'quotestyle' => 'single', 'quotewhat' => 'all', 'open' => '[', 'close' => ']', 'xmlclose' => true, 'filters' => 'Basic' );
Der Schlüssel quotestyle legt fest, ob die Attributwerte, also in <font color="red"> z. B. das red, in einfache oder doppelte Anführungszeichen eingeschlossen werden sollen. Mögliche Werte sind hier single für einfache Anführungszeichen oder double für doppelte Anführungszeichen.
Der Schlüssel quotewhat legt fest, welche Arten von Attributwerten mit Anführungszeichen versehen werden sollen. Der hier gewählte Wert all legt fest, dass alle Arten von Attributen in Anführungszeichen gesetzt werden, wohingegen der Wert nothing dafür sorgt, dass gar keine Anführungszeichen genutzt werden. Der dritte mögliche Wert ist strings. Er definiert, dass alle nicht numerischen Werte in Anführungszeichen verpackt werden.
Die Schlüssel open und close definieren, welche Zeichen als Ersatz für die Kleiner-als- und Größer-als-Zeichen von HTML genutzt werden. Üblich sind hierbei die eckigen Klammern, wobei in einigen Foren oder Gästebüchern auch geschweifte Klammern Verwendung finden.
Mit xmlclose können Sie definieren, ob die Tags so geschlossen werden sollen, wie es in XHTML vorgeschrieben ist. Wo in HTML noch ein <br> ausreichend war, ist in XHTML ein <br /> vorgeschrieben. Übergeben Sie hier ein true, werden leere Elemente entsprechend dieses Schemas mit einem inkludierten Slash abgeschlossen.
Das letzte Element ist das spannendste. Hiermit können Sie definieren, welche BBCodes zulässig sind. Diese sind nämlich in Gruppen zusammengefasst. Die einzelnen Gruppennamen werden hier in einem String übergeben, wobei die einzelnen Namen durch ein Komma zu trennen sind. Mit dem Wert 'Basic,Extended,Email' würden also die Befehlsgruppen Basic, Extended und Email eingebunden. Insgesamt sind die sechs Gruppen Basic, Extended, Email, Images, Links und Lists vorgesehen. Welche Befehle in den Gruppen definiert sind, sehen Sie in Tabelle 17.1.
Anzumerken ist, dass die Konvertierung von E-Mail-Adressen und Links alles konvertiert, was auch nur ansatzweise so aussieht, als könnte es ein Link oder eine E-Mail-Adresse sein. Das kann in einigen Fällen zu einem Fehlverhalten führen, was aber sicher zu verschmerzen ist.