HTML-Dokumente mit tidy untersuchen

17. April 2008

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() kann dann ein genauer Analyse-Bericht angezeigt werden.

$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:

line 5 column 1 - Warning:

isn't allowed in elements
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.

Schreib einen Kommentar

Previous post:

Next post: