PHP DOMDocument не удаляет все элементы - PullRequest
2 голосов
/ 17 марта 2019

Я хочу удалить все элементы script, а здесь код

<?php
$pageFile = <<<EOF
<!DOCTYPE html><html><body>
<script src="aa"></script>
<script src="bb"></script>
<script src="cc"></script>
<div>aaa</div>
</body></html>
EOF;

$dom = new DOMDocument();
$dom->loadHTML($pageFile);

foreach ($dom->getElementsByTagName('script') as $item) {
  $item->parentNode->removeChild($item);
}
$pageFile = $dom->saveHTML();
echo $pageFile;

, но элемент 1 script существует.Вы можете попробовать это онлайн здесь

Результат:

<!DOCTYPE html>
<html><body>
<script src="bb"></script><div>aaa</div>
</body></html>

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

DOMNodeList, возвращаемое $dom->getElementsByTagName, является "живым". Поэтому, когда вы удаляете скрипт, он удаляется из списка узлов, и все элементы списка смещают свои индексы вниз. Затем цикл for переходит к следующему индексу и в итоге пропускает все остальные элементы.

Сначала преобразуйте список узлов в массив.

foreach (iterator_to_array($dom->getElementsByTagName('script')) as $item) {
  $item->parentNode->removeChild($item);
}
1 голос
/ 17 марта 2019

Вы можете изменять и даже удалять узлы из DOMNodeList, если вы выполняете итерацию в обратном направлении: http://php.net/manual/en/class.domnodelist.php#83390 Применение:

<?php
$pageFile = <<<EOF
<!DOCTYPE html><html><body>
<script src="aa"></script>
<script src="bb"></script>
<script src="cc"></script>
<div>aaa</div>
</body></html>
EOF;

$dom = new DOMDocument();
$dom->loadHTML($pageFile);
$elements = $dom->getElementsByTagName('script');
for ($i = $elements->length; --$i >= 0; ) {
  $elem = $elements->item($i);
  $elem->parentNode->removeChild($elem);
}
$pageFile = $dom->saveHTML();
echo $pageFile;
...