DOMNodeList
, возвращаемое $dom->getElementsByTagName
, является "живым". Поэтому, когда вы удаляете скрипт, он удаляется из списка узлов, и все элементы списка смещают свои индексы вниз. Затем цикл for
переходит к следующему индексу и в итоге пропускает все остальные элементы.
Сначала преобразуйте список узлов в массив.
foreach (iterator_to_array($dom->getElementsByTagName('script')) as $item) {
$item->parentNode->removeChild($item);
}