Ces deux solutions devraient fonctionner:
$elements = $doc->getElementsByTagName('htmlText');
while ($elements->length > 0) {
$elements->item(0)->parentNode->removeChild($elements->item(0));
}
ou boucle arrière
$elements = $doc->getElementsByTagName('htmlText');
for ($i = $elements->length-1; $i >= 0; $i--) {
$elements->item($i)->parentNode->removeChild($elements->item($i));
}
En utilisant foreach comme suggéré plus haut, ou en boucle de 0, ne fonctionnera pas parce que la liste des nœuds est modifiée lorsque vous bouclez. Vous pouvez le tester avec le code suivant:
$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();
Voici la liste de noeuds contient 3 éléments: 0 => premier, 1 => secondes, 2 => troisième. Si vous l'exécutez, vous verrez que le second élément n'est pas supprimé car la première itération supprime l'élément à l'index 0 ('first'), laissant la liste des nœuds avec seulement 2 éléments (0 => second, 1 => third). L'itération suivante supprime l'élément à l'index 1 (troisième) et la boucle se termine. Si vous enregistrez ensuite le document, vous verrez que le second élément reste intact. Ce qui est probablement ce que vous avez ressenti lorsque vous avez dit "il n'en supprime que quelques-uns" à la suggestion précédente.
Brillant, travaillé comme un charme. –