我有一个页面充满了我试图解析的元素。我希望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的内容。
我如何单独提取这些?
答案 0 :(得分:1)
在您的示例中,$n
包含5个子节点:
属性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);
?>