如何使用DomDocument-PHP获取嵌套的div、P值
我想从最里面的div访问p元素。也就是说,没有DIV子级的DIV的内容。 这在getElementsByTagName中可能吗如何使用DomDocument-PHP获取嵌套的div、P值,php,domdocument,Php,Domdocument,我想从最里面的div访问p元素。也就是说,没有DIV子级的DIV的内容。 这在getElementsByTagName中可能吗 $html = '<html> <head> <title></title> </head> <body> <div class=""> <div class=""&
$html = '<html>
<head>
<title></title>
</head>
<body>
<div class="">
<div class="">
<p> Content1 </p>
<p> Content2 </p>
<div class="">
<p> Content3 </p>
<p> Content4 </p>
</div>
</div>
<p> Content5 </p>
<h2> Header </h2>
<div class=""><p><strong> Content6 </strong></p> </div>
</div>
<div class=""> <p> Content7 </p></div>
<div class="">
<p> Content8 </p>
<p> Content9 </p>
<div class="">
<p> Content10 </p>
</div>
<span> blah.. </span>
</div>
</body></html>';
根据我的回答,您必须执行另外两个步骤
- 检查当前的父div是否没有任何其他
子div
- 根据div节点对
标记进行分组,您可以利用这些标记将p
节点与它们所属的父div节点匹配p
$ps = [];
$doc = new DomDocument('1.0', 'UTF-8');
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
foreach($doc->getElementsByTagName('p') as $p){
$curr_node = $p->parentNode;
while(property_exists($curr_node,'tagName')){
if($curr_node->tagName == 'div'){
if(isInnerMostChildDiv($curr_node)){
if(!isset($ps[spl_object_id($curr_node)])) $ps[spl_object_id($curr_node)] = [];
$ps[spl_object_id($curr_node)][] = $p->nodeValue;
}
break;
}
$curr_node = $curr_node->parentNode;
if($curr_node === null) break;
}
}
function isInnerMostChildDiv($div_node){
foreach($div_node->childNodes as $c_node){
if(property_exists($c_node,'tagName') && $c_node->tagName == 'div' || !isInnerMostChildDiv($c_node)){
return false;
}
}
return true;
}
$ps = array_values($ps);
print_r($ps);
您以前尝试过DOMDocument,是吗?此问题是上一个问题的延续,但略有不同,但您不接受此处的答案,根据您最初的问题,答案是正确的。对于这个问题,只需要很少的调整。你对这个问题的回答(很好)是绝对正确的。我不是很熟悉这个网站的系统。你能帮我处理这个案子吗?是的,那是我的打字错误。我纠正了问题,谢谢。你是最棒的,伙计。如何在输出中使用saveHTML/XML?@yaradan欢迎。既然所需的结果是数组格式的,为什么需要将其保存为HTML/XML?另外,我建议学习递归来更好地了解当前的解决方案。我的意思是,我没有“内容”,而是“具有原始HTML结构的整个元素”。也就是说,应该使用“Content3”而不是“Content1”printed@yaradan您可以查看上一个问题的答案来检索它。拥有
ownerDocument
的那一个,我使用了下面的代码,它工作了。非常感谢您的帮助$ps[spl\u object\u id($curr\u node)][]=$p->ownerDocument->saveXML($p);
$ps = [];
$doc = new DomDocument('1.0', 'UTF-8');
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
foreach($doc->getElementsByTagName('p') as $p){
$curr_node = $p->parentNode;
while(property_exists($curr_node,'tagName')){
if($curr_node->tagName == 'div'){
if(isInnerMostChildDiv($curr_node)){
if(!isset($ps[spl_object_id($curr_node)])) $ps[spl_object_id($curr_node)] = [];
$ps[spl_object_id($curr_node)][] = $p->nodeValue;
}
break;
}
$curr_node = $curr_node->parentNode;
if($curr_node === null) break;
}
}
function isInnerMostChildDiv($div_node){
foreach($div_node->childNodes as $c_node){
if(property_exists($c_node,'tagName') && $c_node->tagName == 'div' || !isInnerMostChildDiv($c_node)){
return false;
}
}
return true;
}
$ps = array_values($ps);
print_r($ps);