Signatur
Beschreibung
tidyNode ist eine Klasse, die einen einzelnen Knoten (Element, Text, Kommentar, DOCTYPE usw.) innerhalb der Baumstruktur eines von der tidy-Erweiterung geparsten HTML-Dokuments darstellt. Objekte dieser Klasse werden nicht direkt instanziiert, sondern durch Methoden wie tidy::body(), tidy::head() oder tidy::html() sowie über die Eigenschaften child, parent, next und prev traversiert.
Jeder Knoten besitzt Eigenschaften, die Typ, Name, Wert und Position des Knotens im Dokument beschreiben. Über die Eigenschaft child (ein Array von tidyNode-Objekten) lässt sich der gesamte Dokumentbaum rekursiv durchlaufen. Mit hasChildren() und hasSiblings() kann geprüft werden, ob Kindknoten oder Geschwisterknoten vorhanden sind.
Die Klasse ist besonders nützlich, wenn man HTML-Dokumente programmatisch analysieren, Elemente extrahieren oder die Struktur eines bereinigten HTML-Dokuments traversieren möchte, ohne auf reguläre Ausdrücke zurückgreifen zu müssen.
- name – Tag-Name des Elements (z. B.
"p","div") - value – Textinhalt des Knotens als HTML-String
- attribute – Assoziatives Array der HTML-Attribute
- id – Numerische Knoten-ID (Typ-Konstante, z. B.
TIDY_NODETYPE_TEXT) - type – Integer, der den Knotentyp beschreibt
- line / column – Position im Quellcode
- child – Array von Kind-
tidyNode-Objekten
Beispiele
HTML-Baum traversieren und alle Links extrahieren
<?php
$html = '<html><head><title>Test</title></head><body><p>Ein <a href="https://example.com">Link</a> und noch ein <a href="https://php.net">anderer</a>.</p></body></html>';
$tidy = new tidy();
$tidy->parseString($html, ['output-xhtml' => true], 'utf8');
$tidy->cleanRepair();
function findLinks(tidyNode $node): void {
if ($node->name === 'a' && isset($node->attribute['href'])) {
echo 'Link: ' . $node->attribute['href'] . PHP_EOL;
}
if ($node->hasChildren()) {
foreach ($node->child as $child) {
findLinks($child);
}
}
}
$root = $tidy->html();
if ($root instanceof tidyNode) {
findLinks($root);
}
Knotentyp und -wert ausgeben
<?php
$html = '<html><body><p class="intro">Hallo <strong>Welt</strong></p></body></html>';
$tidy = new tidy();
$tidy->parseString($html, [], 'utf8');
$tidy->cleanRepair();
$body = $tidy->body();
echo 'Knoten-Name: ' . $body->name . PHP_EOL;
echo 'Hat Kinder: ' . ($body->hasChildren() ? 'Ja' : 'Nein') . PHP_EOL;
if ($body->hasChildren()) {
$p = $body->child[0];
echo 'Kind-Name: ' . $p->name . PHP_EOL;
echo 'Attribute: ' . print_r($p->attribute, true);
echo 'Wert (HTML): ' . $p->value . PHP_EOL;
}
// Wichtig · Fallstricke
Keine direkte Instanziierung: tidyNode-Objekte können nicht mit new tidyNode() erzeugt werden. Sie werden ausschließlich durch die tidy-Klasse geliefert.
Knotentyp-Konstanten: Der Typ eines Knotens kann mit den TIDY_NODETYPE_*-Konstanten verglichen werden, z. B. TIDY_NODETYPE_TEXT, TIDY_NODETYPE_COMMENT, TIDY_NODETYPE_ELEMENT.
Erweiterung erforderlich: Die tidy-Erweiterung muss beim Kompilieren von PHP aktiviert sein (--with-tidy) oder als Shared Extension geladen werden. Seit PHP 7.1 ist die Klasse als tidyNode (lowercase) dokumentiert.
Vorsicht bei großen Dokumenten: Das rekursive Traversieren sehr großer HTML-Bäume kann zu hohem Speicherverbrauch oder Stack-Überlauf führen. Iterative Ansätze mit einem Stack-Array sind in solchen Fällen stabiler.