作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试遍历文档,并删除节点(在我的情况下为所有 div),但没有 xpath(我已经可以使用 xpath 执行此操作)。出于某种原因,只有第一个 div 被删除。有小费吗?
<?php
//my totally random html
$html = '<p> Great <div> dont want this</div> </p><p> some more</p><div>more crap here</div>';
$doc = new DOMDocument();
$doc->loadHTML($html);
iterate_children($doc );
print $doc->saveHTML();
function iterate_children(&$object){
//print_r($object);
if ($object->tagName == "div") {
$object->parentNode->removeChild($object);
iterate_children($object->parentNode);
}
else {
//if($object->hasChildNodes()) {
foreach($object->childNodes as $child) {
//
iterate_children($child);
//}
}
}
}
?>
最佳答案
只有第一个 div 被删除的原因可能最简单的解释是这样的:
您遍历所有子节点。此迭代首先将当前节点设置为第一个子节点 ( DOMNode::$firstChild
)。然后你处理那个 child ,完成后你继续下一个 child (即 DOMNode::$nextSibling
)。
但是如果你现在从父节点中移除当前节点
$object->parentNode->removeChild($object);
iterator_to_array
在这种情况下非常方便:
$divs = iterator_to_array($doc->getElementsByTagName('div'));
foreach ($divs as $div) {
$div->parentNode->removeChild($div);
}
foreach($object->childNodes as $child) {
iterate_children($child);
}
$children = $object->childNodes;
$children = new IteratorIterator($children);
$children = new CachingIterator($children, CachingIterator::TOSTRING_USE_KEY);
foreach ($children as $child) {
iterate_children($child);
}
$divs = new CachingIterator(new DOMElementFilter(new DOMNodeIterator($doc), 'div'), CachingIterator::TOSTRING_USE_KEY);
foreach ($divs as $div) {
$div->parentNode->removeChild($div);
}
iterator_to_array
非常相似。例子。由于它们的装饰性,迭代器通常使您能够创建更多可重用的代码。
function iterate_children(DOMNode $node)
{
if ($node instanceof DOMElement and $node->tagName == "div") {
$parent = $node->parentNode;
$parent->removeChild($node);
return;
}
$children = $node->childNodes;
if (!$children) {
return;
}
$children = new IteratorIterator($children);
$children = new CachingIterator($children, CachingIterator::TOSTRING_USE_KEY);
foreach ($children as $child) {
iterate_children_old($child);
}
}
<?php
/**
* PHPDom iterate through document and remove nodes without XPath
*/
/my totally random html
$html = '<p> Great <div> dont want this</div> </p><p> some more</p><div>more crap here</div>';
$doc = new DOMDocument();
$doc->recover = true;
$saved = libxml_use_internal_errors(true);
$doc->loadHTML($html);
libxml_use_internal_errors($saved);
$divs = iterator_to_array($doc->getElementsByTagName('div'));
foreach ($divs as $div) {
$div->parentNode->removeChild($div);
}
echo $doc->saveHTML();
关于PHPDom 遍历文档并删除没有 XPath 的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29757037/
我是一名优秀的程序员,十分优秀!