Diese beiden Lösungen unter Verwendung funktionieren soll:
$elements = $doc->getElementsByTagName('htmlText');
while ($elements->length > 0) {
$elements->item(0)->parentNode->removeChild($elements->item(0));
}
oder Schleife rückwärts
$elements = $doc->getElementsByTagName('htmlText');
for ($i = $elements->length-1; $i >= 0; $i--) {
$elements->item($i)->parentNode->removeChild($elements->item($i));
}
Mit foreach wie bereits weiter oben erwähnt, oder von 0 Looping nach oben, wird nicht funktionieren, weil die Knotenliste während der Schleife geändert wird. Sie können diesen Test mit dem folgenden Ausschnitt:
$doc = new DOMDocument();
$doc->loadHTML('<p>first</p><p>second</p><p>third</p>');
foreach ($doc->getElementsByTagName('p') as $el) {
$el->parentNode->removeChild($el);
}
echo $doc->saveHTML();
Hier wird die Knotenliste enthalten 3 Elemente: 0 => zuerst, 1 => Sekunde, 2 => Drittel. Wenn Sie es ausführen, sehen Sie, dass das zweite Element nicht entfernt wird, da die erste Iteration das Element bei Index 0 ('first') entfernt und die Knotenliste nur mit zwei Elementen (0 => Sekunde, 1 => dritte) verlässt. Die nächste Iteration entfernt das Element am Index 1 (dritte) und die Schleife endet. Wenn Sie das Dokument dann speichern, bleibt das zweite Element unverändert. Was Sie wahrscheinlich erlebt haben, als Sie gesagt haben "es löscht nur einige von ihnen" auf den vorherigen Vorschlag.
Brilliant, arbeitete wie ein Charme. –