当您使用 replaceChild() 更改节点树时,引用也会更改,因此 foreach 可能会提前终止,因为 getElementsByTagName() 返回一个 Iterator,因此它是动态的。
我建议你将 getElementsByTagName() 返回的节点固定到一个数组中,然后遍历该数组:
// .....
$doc->loadHTML(mb_convert_encoding($htmlstr, 'HTML-ENTITIES', 'UTF-8'));
$brsArray = iterator_to_array($brs, true);
foreach ($brsArray as $node) {
//.....