2014-11-05 59 views
0

我有麻烦尝试使用PHP的DOMDocument检索节点的值。如果需要节点有一些子节点 - 节点值也将包含它们的内容。我能够检索没有其子节点内容的节点值吗?

例子:我有一个具有以下内容的HTML文件:

<div> 
    small 
    <div id="main_div"> 
    Main div with a huge content in it 
    <div>Subdiv 1</div> 
    <div>Subdiv 2</div> 
    <div>Subdiv 3</div> 
    Tail of the main div 
    </div> 
</div> 

而下面的PHP脚本:

$site = new DOMDocument(); 
$site->loadHTML($content); 
$divs = $site->getElementsByTagName('div'); 
foreach($divs as $div){ 
    echo $div->textContent; 
    echo "<br>"; 
} 

如果我试图让节点ID main_div它的nodeValue将等于:

Main div with a huge content in it Subdiv 1 Subdiv 2 Subdiv 3 Tail of the main div 

我能检索到只有“M ain div中有一个巨大的内容尾部的主分区“(main_div的内容没有子女)?

我已阅读'Getting content of the node having childs via DOMDocument'这个问题,但接受的答案让我得到相同的结果:节点正在输出其子女的内容。

回答

2

每个div元素内都是包含实际文本的DOMText节点。而不是使用$div->textContent,收集每个子文本节点的nodeValues:

foreach($divs as $div){ 
    $text = array(); 

    foreach ($div->childNodes as $childNode) { 
    if ($childNode->nodeType === XML_TEXT_NODE && $childNode->nodeValue) { 
     $text[] = trim($childNode->nodeValue); 
    } 
    } 

    if ($text) { 
    print implode(' ', $text) . '<br>'; 
    } 
} 
+0

谢谢Alf!有效!唯一的问题是'#main_div'内容分成两部分。但它可以简单地连接在一起。 – 2014-11-05 20:30:49