$dom = new DOMDocument();
@$dom->loadHTML($description);
$pTag = $dom->getElementsByTagName('p');
foreach ($pTag as $value) {
/** @var DOMElement $value */
$id = $value->getAttribute('data-spotid');
if ($id) {
$value->parentNode->removeChild($value);
}
}
但是,当我要删除孩子时,它正在重新索引dom.假设我有8个项目我删除了第一个它将重新索引它,第二个元素将成为第一个它不会删除它将转到第二个现在是第三个元素.
解决方法:
这在DomNode::removeChild
文档的一些注释中提到,问题显然是foreach上的迭代器指针无法处理在循环遍历子项列表时从父数组中删除项的事实(或者其他的东西).
建议的修复方法是首先遍历主节点,然后将要删除的子节点推送到自己的数组,然后循环遍历“待删除”数组并从父节点中删除这些子节点.例:
$dom = new DOMDocument();
@$dom->loadHTML($description);
$pTag = $dom->getElementsByTagName('p');
$spotid_children = array();
foreach ($pTag as $value) {
/** @var DOMElement $value */
$id = $value->getAttribute('data-spotid');
if ($id) {
$spotid_children[] = $value;
}
}
foreach ($spotid_children as $spotid_child) {
$spotid_child->parentNode->removeChild($spotid_child);
}