XPath savehtml删除父元素

时间:2013-06-22 15:35:25

标签: php xpath parent

我想在父元素中获取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删除父元素?

2 个答案:

答案 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语法正确。