2013-06-22 100 views
0

我想获取父元素内的HTML。例如,我有这样的结构:XPath savehtml移除父元素

<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

您正在寻找一种称为* innerHTML *的东西,它在早期版本的DOM(浏览器)中是非标准的东西。你可能会想象你不是第一个问这个问题的人。 – hakre

+0

[PHP的DomDocument中的innerHTML?]可能重复?(http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument) – hakre

回答

0

您可能需要

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

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

+0

你太棒了!非常感谢你! – lam3r4370

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表达式查询节省的元素直接