我想在父元素中获取HTML。例如,我有这样的结构:
<div>
<div>text<b>more text</b>and <i>some more</i></div>
</div>
我希望得到text<b>more text</b>and <i>some more</i>
。
这是我的代码:
$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);
$text = $xpath->query("//div/div");
$html = $dom->saveHTML($text->item(0));
结果是
<div>text<b>more text</b>and <i>some more</i></div>
我想过使用preg_replace,但这不是一个好主意。如何使用XPath删除父元素?
答案 0 :(得分:1)
而不是查看你的问题删除父母(面对有问题的输出,然后认为你需要删除某些内容),只需将其旋转180°并考虑不添加它首先。那就是保存该div的所有子节点的HTML。
首先是//div/div
的所有子节点的xpath表达式:
//div/div/node()
这意味着在xpath中查询任何节点类型,所以不仅是元素节点,而且还有你需要的文本节点。
所以你现在想在所有这些节点上使用$dom->saveHTML()
。这可以通过将该函数调用映射到所有这些项来完成:
$inner = $xpath->query("//div/div/node()");
$html = implode('', array_map([$dom, 'saveHTML'], iterator_to_array($inner)));
这将使$html
成为以下内容:
text<b>more text</b>and <i>some more</i>
除了映射之外,您还可以使用可能更容易阅读的更详细的代码:
$inner = $xpath->query("//div/div/node()");
$html = '';
foreach($inner as $node) {
$html .= $dom->saveHTML($node);
}
与之前的答案相比,您可以看到它类似但更简化,因为它使用xpath表达式查询元素以直接保存 。
答案 1 :(得分:0)
您可能需要
$html = '';
foreach ($text->item(0)->childNodes as $child) {
$html .= $dom->saveHTML($child);
}
这是伪代码迭代div
元素节点的子节点,我希望我的PHP语法正确。