0

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

4

2 回答 2

0

与其查看您的问题以删除父级(这是面对有问题的输出然后认为您需要删除某些内容),只需将其旋转 180° 并考虑首先不添加它。那就是保存该 div 的所有子节点的 HTML。

首先是 的所有子节点的 xpath 表达式//div/div

//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 表达式来查询要直接保存的元素。

于 2013-06-23T19:05:52.047 回答
-1

你可能需要

$html = '';
foreach ($text->item(0)->childNodes as $child) {
  $html .= $dom->saveHTML($child);
}

那是遍历div元素节点的子节点的伪代码,我希望我的 PHP 语法正确。

于 2013-06-22T17:09:37.757 回答