Suchen

Suche

Aktuell

  • Aktuell
  • Kommentare
  • TagCloud
  • Bis jetzt sind noch keine Kommentare geschrieben worden
 .Net   Suche   ASP.Net   Asp.Net   Beta   Buchtipp   C#   CentOS   CoD   DateTime   DiceFight   Funktion   HTML   HowTo   HttpWebRequest   IIS7   JSON   Konfiguration   LCD   Lighttpd   Linux   Media   Microsoft   Mobile   Mono   MySQL   Oracle   Outlook   PHP   PostgreSQL   Programme   Quake3   RC   RealURL   SMTPE   SVN   Server   Snippet   TYPO3   Timeout   Treiber   Tutorial   USB   Vista   WebClient   Windows   bauer-martin.com   bm_chart   ffmpeg   x64 

Randnotiz

W3C

Valid XHTML Valid CSS

Tutorials, PHP, HTML - 17.04.2008 18:23 - Alter: 2 yrs
- Keine Kommentare

HTML-Dokumente mit tidy untersuchen

Tags: PHP, Tidy, HTML, parsen

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(<TidyObject>) 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: <p> isn't allowed in <head> 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 <html>-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 <head> bzw. <body>-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 <head> bzw. <body>-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.



Blink del.icio.us Digg Furl Google Simpy Spurl Technorati Yahoo

Kommentare

  • Bis jetzt sind noch keine Kommentare geschrieben worden

Kommentar schreiben

Ins Gästebuch eintragen
CAPTCHA Bild zum Spamschutz