2013-04-15 79 views
1

我正在使用DOMDocument在HTML页面上检索一个特殊的div。PHP DOMDocument,检索一个div的内容,没有div标签

我只是想检索这个div的内容,没有div标签。

例如:

$dom = new DOMDocument; 
$dom->loadHTML($webtext['content']); 
$main = $dom->getElementById('inter'); 
$dom->saveHTML() 

在这里,我有结果:

<div id="inter"> 
//SOME THINGS IN MY DIV 
</div> 

,我只是想有:

//SOME THINGS IN MY DIV 

想法?谢谢 !

+0

阅读**手册**:http://www.php.net/manual/en/class.domelement.php#101243 – BlitZ

回答

3

我要去用简单的做了。你已经拥有:现在

$dom = new DOMDocument; 
$dom->loadHTML($webtext['content']); 
$main = $dom->getElementById('inter'); 
$dom->saveHTML(); 

DOMDocument::getElementById()返回一个DOMElement延伸DOMNode它具有public stringnodeValue。既然你没有指定你是否期望在div之内的任何内容,我会假设你想要以纯文本的形式存储任何内容。为此,我们要去除$dom->saveHTML();,而是将其替换为:

$divString = $main->nodeValue; 

就这样,$divString将包含//SOME THINGS IN MY DIV,其中,从你的榜样,是所需的输出。

但是,如果你想它的内部,而不是只是一个字符串表示的HTML - 以代替替换为以下:

$divString = ""; 
foreach($main->childNodes as $c) 
    $divString .= $c->ownerDocument->saveXML($c); 

什么,做是利用了继承DOMNode::childNodes其中包含的一个DOMNodeList每个包含自己的DOMNode(供参考,见上),我们循环每一个得到ownerDocument这是一个DOMDocument,我们称之为DOMDocument::saveXML()功能。我们将当前的$c节点传递给该函数的原因是为了防止输出完整的有效文档,并且因为ownerDocument就是我们正在循环的内容 - 我们需要一次找到一个孩子,没有孩子留下。 (对不起,它迟到了,无法抗拒。)

现在,在任一选项之后,你可以用$divString做什么。我希望这有助于向你解释这个过程,希望你能够更好地理解发生的事情,而不是仅仅因为它的作用而死记硬背地复制代码。 ^^

+0

我只是用saveXML()试过这个,但它仍然包含我的元素:( – bluppfisk

+0

@bluppfisk是的,它会的,因为它是有意的如果你不这样做,请重新阅读答案以获得输出^^ – Jon

+0

对不起,我自己不是很清楚,我的意思是我做了$ dom-> getElementById('span'),发现'span'元素本身仍然包含在我使用savedXML的时候。想要保留所有其他的HTML,所以nodeValue是没有选择的,但不是标签。我该如何去除它? – bluppfisk

0

可以使用xpath

$xpath = new DOMXPath($xml); 

foreach($xpath->query('//div[@id="inter"]/*') as $node) 
{ 
    $node->nodeValue 
} 

或simplu您可以编辑您的代码。 see here

$main = $dom->getElementById('inter'); 

echo $main->nodeValue 
+0

只是想指出你的第二个代码块不起作用。 '$ main'在这一点将是一个['DOMElement'](http://us2.php.net/manual/en/class.domelement.php),不能迭代。 – Jon

+0

@Jon我认为它会工作..我用这种方式多次使用它... – alwaysLearn

+0

即使您将'$ node-> nodeValue'赋予该循环中的某些东西,我也欢迎您尝试它,没有什么,循环从不运行。 =]请阅读['getElementById'](http://us2.php.net/manual/en/domdocument.getelementbyid.php)以供参考,如果您使用['getElementsByTagName']](http://us2.php。 net/manual/en/domdocument.getelementsbytagname.php),它可以工作,因为它提供['DOMNodeList'](http://us2.php.net/manual/en/class.domnodelist.php)。 ^^ – Jon

0

你可以使用我的自定义功能,从内容中删除多余的div

$html_string = '<div id="inter"> 
     SOME THINGS IN MY DIV 
    </div>'; 

//自定义函数

function DOMgetinnerHTML($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; 
} 

你的代码会喜欢

$dom = new DOMDocument; 
$dom->loadHTML($html_string); 
$divs = $dom->getElementsByTagName('div'); 
$innerHTML_contents = DOMgetinnerHTML($divs->item(0)); 
echo $innerHTML_contents 

和你的输出就会

SOME THINGS IN MY DIV 
+0

除了它不是你的功能,你从http://php.net/manual/en/book.dom.php#89718得到它不要声称是你的东西当你复制一条线的功能线从其他地方。 – Jon