Signatur
Beschreibung
Dom\Text ist Teil der modernisierten PHP-DOM-Erweiterung (Namespace Dom\, eingeführt in PHP 8.4) und repräsentiert einen Textknoten innerhalb eines XML- oder HTML-Dokuments. Textknoten enthalten den eigentlichen Zeicheninhalt zwischen Tag-Öffnungen und -Schließungen, also z. B. das Hallo Welt in <p>Hallo Welt</p>.
Die Klasse erbt von Dom\CharacterData, welche grundlegende Methoden zur Manipulation von Zeichendaten bereitstellt, etwa appendData(), deleteData(), insertData(), replaceData() und substringData(). Dadurch lässt sich der Textinhalt eines Knotens gezielt lesen und verändern, ohne das gesamte Dokument neu aufbauen zu müssen.
Dom\Text bietet zusätzlich die Methode splitText(), mit der ein Textknoten an einer bestimmten Zeichenposition in zwei aufeinanderfolgende Textknoten aufgeteilt werden kann. Das ist hilfreich, wenn an einer bestimmten Stelle im Text ein neues Element eingefügt werden soll. Neu erzeugte Textknoten erstellt man typischerweise über Dom\Document::createTextNode().
Im Gegensatz zur älteren DOMText-Klasse aus dem globalen Namespace arbeitet Dom\Text ausschließlich mit den neuen, strikteren DOM-Klassen zusammen (Dom\Document, Dom\Element usw.) und folgt dem offiziellen WHATWG-DOM-Standard enger.
Beispiele
Textknoten erstellen und auslesen
<?php
$doc = Dom\XMLDocument::createEmpty();
$root = $doc->createElement('greeting');
$doc->appendChild($root);
$textNode = $doc->createTextNode('Hallo Welt');
$root->appendChild($textNode);
echo $textNode->data . PHP_EOL; // Hallo Welt
echo $textNode->nodeType . PHP_EOL; // 3 (TEXT_NODE)
echo $doc->saveXml();
Textknoten aufteilen mit splitText()
<?php
$doc = Dom\XMLDocument::createEmpty();
$root = $doc->createElement('p');
$doc->appendChild($root);
$textNode = $doc->createTextNode('FooBar');
$root->appendChild($textNode);
// Teilt den Textknoten nach Position 3 auf
$second = $textNode->splitText(3);
// Jetzt ein neues Element zwischen beiden Textknoten einfügen
$em = $doc->createElement('em');
$em->appendChild($doc->createTextNode('-'));
$root->insertBefore($em, $second);
echo $doc->saveXml();
Textinhalt mit appendData() erweitern
<?php
$doc = Dom\XMLDocument::createEmpty();
$root = $doc->createElement('title');
$doc->appendChild($root);
$text = $doc->createTextNode('PHP ');
$root->appendChild($text);
$text->appendData('8.4');
echo $text->data . PHP_EOL; // PHP 8.4
echo $text->length . PHP_EOL; // 7
// Wichtig · Fallstricke
Namespace-Trennung: Dom\Text ist nicht kompatibel mit der älteren DOMText-Klasse aus dem globalen Namespace. Dokumente, die mit Dom\XMLDocument oder Dom\HTMLDocument erstellt wurden, liefern ausschließlich Objekte aus dem Dom\-Namespace zurück.
Whitespace-Textknoten: Beim Parsen von XML/HTML entstehen häufig Textknoten, die nur Leerzeichen oder Zeilenumbrüche enthalten. Diese sind reguläre Dom\Text-Instanzen und tauchen in der Kindknoten-Liste auf. Das muss bei der Traversierung berücksichtigt werden.
Entitäten: Der Inhalt eines Textknotens wird automatisch korrekt escaped (z. B. < → <), wenn das Dokument serialisiert wird. Rohes HTML sollte daher niemals direkt in Textknoten eingefügt werden, sondern stets über die DOM-API.