微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 在foreach中重新索引dom的DomDocument removeChild

我试图删除带有data-spotid属性的p标签

        $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); 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐