Как удалить элемент с помощью DOMDocument?


Можно ли удалить элемент из загруженного DOM без создания нового? Например, что-то вроде этого:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);

foreach($dom->getElementsByTagName('a') as $href)
    if($href->nodeValue == 'First')
        //delete
Author: Kin, 2013-03-07

3 answers

Вы удаляете узел, сообщая родительскому узлу удалить дочерний:

$href->parentNode->removeChild($href);

См. DOMNode::$parentNode Документы и DOMNode::removeChild() Документы.

Смотрите также:

 76
Author: hakre, 2017-05-23 12:09:57

Легко:

$href->parentNode->removeChild($href);
 16
Author: silkfire, 2013-03-07 13:43:18

Мне потребовалось некоторое время, чтобы понять это, поэтому вот некоторые пояснения:

Если вы удаляете элементы из цикла (как в примере операции), вам нужно выполнить цикл в обратном направлении

$elements = $completePage->getElementsByTagName('a');
for ($i = $elements->length; --$i >= 0; ) {
  $href = $elements->item($i);
  $href->parentNode->removeChild($href);
}

Документация по DOMNodeList: Вы можете изменять и даже удалять узлы из списка DOMNodeList, если выполните итерацию в обратном направлении

 13
Author: alexanderbird, 2015-12-02 07:43:06