如何使用 DomDocument 获取嵌套的 div 和 P 值 - PHP
How to get nested divs , P Values with DomDocument - PHP
我想从最里面的 DIV 访问 P 元素。也就是说,没有 DIV 子项的 DIV 的内容。
这可以用 getElementsByTagName 实现吗?
$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>';
预期输出如下:
Array
(
[0] => Array
(
[0] => Content3
[1] => Content4
)
[1] => Array
(
[0] => Content6
)
[2] => Array
(
[0] => Content7
)
[3] => Array
(
[0] => Content10
)
)
根据我的回答 ,您将不得不执行两个额外的步骤。
- 检查当前父div手头是否没有任何其他
child divs
。
- 基于 div 个节点对
p
标签进行分组,您可以使用 spl_object_id
将 p
节点与相同的父节点 div 相匹配他们属于。
片段:
$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);
我想从最里面的 DIV 访问 P 元素。也就是说,没有 DIV 子项的 DIV 的内容。 这可以用 getElementsByTagName 实现吗?
$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>';
预期输出如下:
Array
(
[0] => Array
(
[0] => Content3
[1] => Content4
)
[1] => Array
(
[0] => Content6
)
[2] => Array
(
[0] => Content7
)
[3] => Array
(
[0] => Content10
)
)
根据我的回答
- 检查当前父div手头是否没有任何其他
child divs
。 - 基于 div 个节点对
p
标签进行分组,您可以使用spl_object_id
将p
节点与相同的父节点 div 相匹配他们属于。
片段:
$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);