2012-08-24 72 views
1

我想检索某个标签中的html代码。我知道DomDocument能够做到这一点。但是,如果我想提取没有外部标签的内容,怎么能实现?在PHP中没有外标签的某个标签中提取Html内容

例如,

$html = '<div><span>Hello world!</span><br><p>some other text</p></div>';  
$doc = new DOMDocument; 
$doc->loadHTML($html); 
echo $doc->saveXML($doc->getElementsByTagName('div')->item(0)); 

这将输出,

<div> 
    <span>Hello world!</span> 
    <br> 
    <p>some other text</p> 
</div> 

我希望它没有外部div标签。我尝试了节点值,但它剥离了所有标签。

$html = '<div><span>Hello world!</span><br><p>some other text</p></div>';  
$doc = new DOMDocument; 
$doc->loadHTML($html); 
$node = $doc->getElementsByTagName('div')->item(0); 
echo $node->nodeValue; 

任何想法?

+0

什么你问并没有真正意义,你问标记及其内容,但你说你不想要的标签。既然你知道你要求什么标签,你可以很简单地用正则表达式去除它,或者你可以简单地选择你想要的标签,而不必介意有外层标签。 – deed02392

+0

您正确地得到了问题。这意味着这个问题是有道理的。如果您认为这很简单,您可以发布解决方案吗? – Teno

+0

我同意它是有道理的,有时我会忘记自己。我已经发布了一个适合你的解决方案。 – deed02392

回答

4

好了,怎么样一个PHP的innerHTML实现:

<?php 
$html = '<div><span>Hello world!</span><br><p>some other text</p></div>';  
$doc = new DOMDocument; 
$doc->loadHTML($html); 
$node = $doc->getElementsByTagName('div')->item(0); 
echo DOMinnerHTML($node); 

function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
     $tmp_dom = new DOMDocument(); 
     $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
     $innerHTML.=trim($tmp_dom->saveHTML()); 
    } 
    return $innerHTML; 
} 
?> 
+0

完美,谢谢。 – Teno

+0

或使用DOMDocumentFragment而不是DOMDocument ... – VolkerK