如何在使用DOMDocument时将文本内容分开

时间:2017-01-12 05:00:40

标签: php domdocument

我有一个页面充满了我试图解析的元素。我希望class1和class2作为单独的文本。但是,class1存在于class1中。因此,如果我执行textContent,它将检索所有文本。

继承人的结构......

 <div class='class1'> 
     Name <br/> <span class='class2'>Other Name</span>
  </div>

如果我这样做......

 $dom = new DOMDocument();
 $dom->loadHTMLFile($url);
 $finder = new DomXPath($dom);
 $classname="class2";
 $nodes = $finder->query("//*[contains(@class, '$classname')]");
 foreach($nodes as $n){
     echo $n->textContent;
 }

我可以获得class2 elemtn就好了。 但如果我为class1做同样的事情。我得到了class1的textContent,它还包含了class2的内容。

我如何单独提取这些?

3 个答案:

答案 0 :(得分:1)

在您的示例中,$n包含5个子节点:

  1. &#34;名称&#34;
  2. &#34;&LT峰; br /&GT;&#34;
  3. &#34; &#34;
  4. &#34;&lt; span class =&#39; class2&#39;&gt;其他名称&lt; / span&gt;&#34;
  5. &#34; &#34;
  6. 属性textContent由此节点及其所有后代的文本组成。 要仅访问第一个孩子使用的内容:

    echo $n->firstChild->textContent;
    

答案 1 :(得分:0)

在普通的javascript中,您可以过滤/映射以仅从节点中提取文本子项。像这样:

WEB API

答案 2 :(得分:0)

只使用DOMDocument,我会做这样的事情:

<?php
function getElementsByClassName(DOMDocument $dom, $className, $parentNode = null){
  $node = $parentNode ? $parentNode : $dom;
  $a = array(); $all = $node->getElementsByTagName('*');
  foreach($all as $e){
    if($e->hasAttribute('class') && $e->getAttribute('class') === $className){
      $a[] = $e;
    }
  }
  return $a;
}
function getNodeValueBeforeBr($node){
  return preg_replace('/\s*<\s*br\s*\/?\s*>$/i', '', $node->nodeValue);
}
$dom = new DOMDocument; @$dom->loadHTMLFile('yourFileName.php');
$class1 = getElementsByClassName($dom, 'class1'); $results = array();
foreach($class1 as $node){
  $results[] = getNodeValueBeforeBr($node);
}
print_r($results);
?>