我能否在没有子节点内容的情况下检索节点值?

时间:2014-11-05 09:29:05

标签: php parsing domdocument

我尝试使用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>";
}

如果我尝试获取节点标识main_div,则其nodeValue将等于:

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

我是否只能检索“主要div中包含大量内容的主要内容”(main_div没有孩子的内容)?

我已经阅读了问题'Getting content of the node having childs via DOMDocument'但是接受的答案让我得到了相同的结果:节点正在输出他们孩子的内容。

1 个答案:

答案 0 :(得分: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>';
  }
}