【发布时间】:2016-08-22 23:24:14
【问题描述】:
我正在尝试删除带有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 个项目,我删除了第一个,它将重新索引它,第二个元素将成为第一个,它不会删除它将转到第二个,现在是第三个元素。
【问题讨论】:
-
我认为“重新索引”这个词不太合适。如果循环被操纵,听起来 foreach 迭代器无法“倒带”自身(可以这么说)以始终位于循环中的最新项目上。因此,这可能是一个比
DomDocument特定的问题更普遍的引用问题。 -
看来我的预感有一些优点:php.net/manual/en/domnode.removechild.php#90292
-
@Yoshi - 这是一个非常简洁的沙盒网站。与使用
iterator_to_array的原始演示或类似代码相比,运行两个循环(一个在其中构建子元素数组,另一个在其中从其父元素中删除子元素)似乎在不同版本中始终具有更好的性能结果首先创建一个数组变量,然后将该变量传递到 foreach 循环中。 -
@Yoshi - 使用
iterator_to_array但高于foreach: 3v4l.org/5ug9c ;使用两个foreach循环来获取孩子,然后将其删除:3v4l.org/dJiPA
标签: javascript php html dom domdocument