XPath savehtml remove parent element

非 Y 不嫁゛ 提交于 2019-12-12 00:28:28

问题


I want to get the HTML inside the parent element. For example, I have this structure:

<div>
<div>text<b>more text</b>and <i>some more</i></div>
</div>

and I want to get text<b>more text</b>and <i>some more</i> as a result.

Here's my code:

$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);
$text = $xpath->query("//div/div");
$html = $dom->saveHTML($text->item(0));

And the result is

<div>text<b>more text</b>and <i>some more</i></div>

I thought of using preg_replace but it's not a good idea. How can I remove the parent element using XPath?


回答1:


You might need

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

That's pseudo code iterating over the child nodes of the div element node, I hope I got the PHP syntax right.




回答2:


Instead of looking onto your problem to remove the parent (which is confronting yourself with the problematic output and then thinking you need to remove something), just turn it 180° around and consider to not add it in the first place. That is saving the HTML of all child-nodes of that div.

First the xpath expression for all child-nodes of //div/div:

//div/div/node()

That means in xpath to query any node-type, so not only element-nodes for example but also the text-nodes which you need here.

So you now want to use $dom->saveHTML() on all these nodes. This can be done by mapping that function call onto all those items:

$inner = $xpath->query("//div/div/node()");
$html  = implode('', array_map([$dom, 'saveHTML'], iterator_to_array($inner)));

This will make $html the following:

text<b>more text</b>and <i>some more</i>

Instead of mapping you can also use the bit more verbose code that is probably more easy to read:

$inner = $xpath->query("//div/div/node()");

$html = '';
foreach($inner as $node) {
    $html .= $dom->saveHTML($node);
}

Compared with the previous answer you can see it's similar but a bit more simplified because it uses the xpath expression to query the elements to save directly.



来源:https://stackoverflow.com/questions/17252387/xpath-savehtml-remove-parent-element

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!