获取特定DOMElement的文本内容

时间:2016-10-23 06:35:13

标签: php

经过一次小发后,我发现DOMElement-> textContent还会返回该元素子元素的组合文本。

环顾四周,我看到有人建议使用DOMElement-> firstChild-> textContent,但这对我没有好处,因为我正在查看层次结构后面的文档和元素属性的提示,数据只是可能是在树枝而不是树叶上,所以即使其中只有一个是正确的,我也会获得多次点击。

是否有实际的方法来获取这个特定元素的文本内容而不是它的子元素?

编辑:nvm,找到了确保

的方法
    function get_text($el) {
        if (is_a($el->firstChild, "DOMText")) return $el->firstChild->textContent;
        return "";
    }

1 个答案:

答案 0 :(得分:0)

只需迭代子节点并检查下一个节点是否为文本。您 可能想要跳过仅由空格字符组成的节点:

function getNodeText(DOMNode $node) {
  if ($node->nodeType === XML_TEXT_NODE)
    return $node->textContent;

  $node = $node->firstChild;
  while ($node) {
    if ($node->nodeType === XML_TEXT_NODE &&
      $text = trim($node->textContent))
    {
      return $text;
    }
    $node = $node->nextSibling;
  }
  return '';
}

$xml = <<<'EOXML'
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <child>
    <x>x text</x>
    child text
  </child>
  root text
</root>
EOXML;


$doc = new DOMDocument();
$doc->loadXML($xml);

var_dump(getNodeText($doc->getElementsByTagName('x')[0]));
var_dump(getNodeText($doc->getElementsByTagName('root')[0]));
var_dump(getNodeText($doc->getElementsByTagName('child')[0]));

示例输出

string(6) "x text"
string(9) "root text"
string(10) "child text"