Die DOM-Struktur eines HTML-Dokuments lässt sich auf einfache Art und Weise mittels tidy (http://de3.php.net/manual/de/book.tidy.php) untersuchen. Leider ist diese Klasse in PHP noch nicht richtig implementiert und die Dokumentation weist noch sehr viele Lücken auf.
HTML-Dokument laden
tidy kann direkt Dateien oder aber auch Strings laden. Dies erfolg über die Methoden parseFile() und parseString()
// Laden einer Datei $tidy = new tidy(); $tidy->parseFile('file.html'); // Laden eines Strings $string = '<html><head><title>Test</title><body>Inhalt</body></html>'; $tidy = new tidy(); $tidy->parseString($string);
Analysieren und Reparieren der Struktur
tidy kann die Struktur einer HTML-Datei analysieren und auch reparieren. Die Methode diagnose() anaylisiert die Struktur und gibt bei Erfolg true, ansonsten false zurück. Mittels tidy_get_error_buffer(
$tidy = new tidy(); $tidy->parseFile('file.html'); $tidy->diagnose(); echo tidy_get_error_buffer($tidy);
Das obrige Beispiel erzeugt eine Ausgabe, die wie folgt aussehen könnte:
isn't allowed in line 5 column 1 - Warning:
line 5 column 1 - Warning: inserting missing 'title' element
Info: Doctype given is "-//W3C//DTD XHTML 1.0 Strict//EN"
Info: Document content looks like XHTML 1.0 Strict
2 warnings, 0 errors were found!
Sollte die Struktur nun beschädigt sein, z. B. fehldende -Tags, Doctype, etc. kann diese mittels clean_repair() Repariert werden.
$tidy->cleanRepair();
Leider kann man dieser Methode keine weiteren Parameter mit übergeben und so wird auch die Zeichenkodierung oft fälschlicherweise überschreiben. Daher sollte bereits beim Aufruf der parseFile()/parseString() Methoden die Zeichenkodierung mit übergeben werden.
$tidy = new tidy; $tidy->parseString('<p>Test</p>', array('indent' => true, 'output-xhtml' => true, 'wrap' => 200), 'utf8'); $tidy->cleanRepair();
Das Beispiel erzeugt folgende Ausgabe:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> <title></title> </head> <body> <p>Test</p> </body> </html>
head und body
Möchte man nur den
bzw. -Bereich eines HTML-Dokuments, so erhält man diese über die Methoden head() und body();$head = $tidy->head(); $body = $tidy->body();
Diese Methoden geben ein tidyNode Objekt zurück, welche beim
bzw. -Tag starten. Im child Attribut befinden sich dann der Inhalt als tinyNode Objekte. Diese kann man ganz einfach per foreach auslesen.foreach($head->child as $child) { echo $child->value; }
Die Attribute eines tidyNode Objektes sind:
value – the value of the node (e.g. the html text)
name – the name of the tag (e.g. html, a, etc..)
type – the type of the node (one of the constants above, e.g. TIDY_NODETYPE_PHP)
line* – the line where the node starts
column* – the column where the node starts
proprietary* – TRUE if the node refers to a proprietary tag
id – the ID of the tag (one of the constants above, e.g. TIDY_TAG_FRAME)
attribute – an array with the attributes of the current node, or NULL if there aren’t any
child – an array with the child tidyNodes, or NULL if there aren’t an
Wie bereits oben erwähnt ist die tidy-Funktion in PHP noch nicht wirklich vollständig implementiert und einig wichtige und interessante Methoden, wie z. B. get_nodes() funktionieren aktuell noch nicht. Ebenso ist die Dokumentation bei weitem noch nicht vollständig. Jedoch sollte man diese Klasse umbedingt weiter im Auge behalten.