如何检查 dom 节点列表是否已经有相同的节点
How to check if dom node list already has the same node
我需要通过 PHP DOMDocument
获取所有页面段落和所有列表项的所有 parent
比方说,我们有这样的 html:
<div>
<p>Some text</p>
<p>Some text</p>
</div>
<section>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
</section>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
如果我使用以下两个循环
$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
$parents[] = $paragraph->parentNode;
}
foreach($dom->getElementsByTagName('li') as $li) {
$parents[] = $li->parentNode;
}
最后我只需要为每个 parent 添加一个 class 就像
foreach($parents as $key => $parent) {
$parent->setAttribute('class', 'prefix_'.$key);
}
并希望获得输出
<div class="prefix_0">
...
</div>
<section class="prefix_1">
...
</section>
<div class="prefix_2">
...
</div>
但是我明白了
<div class="prefix_0 prefix_1">
...
</div>
<section class="prefix_2 prefix_3 prefix_4">
...
</section>
<div class="prefix_5 prefix_6 prefix_7 prefix_8">
...
</div>
如果我加上条件
if(!in_array($paragraph->parentNode, $parents)) {
如我所见,它不起作用,因为我们没有数组,而是节点列表
那么如何避免添加相同的parent?
非常简单的功能来避免它:
function compareParentNode($compare_node,$parents){
foreach($parents as $parent){
if ($parent->isSameNode($compare_node)) return true;
}
return false;
}
使用:
$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
$parentNode = $paragraph->parentNode;
if (!compareParentNode($parentNode,$parents)){
$parents[] = $paragraph->parentNode;
}
}
查看更多isSameNode
我需要通过 PHP DOMDocument
比方说,我们有这样的 html:
<div>
<p>Some text</p>
<p>Some text</p>
</div>
<section>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
</section>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
如果我使用以下两个循环
$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
$parents[] = $paragraph->parentNode;
}
foreach($dom->getElementsByTagName('li') as $li) {
$parents[] = $li->parentNode;
}
最后我只需要为每个 parent 添加一个 class 就像
foreach($parents as $key => $parent) {
$parent->setAttribute('class', 'prefix_'.$key);
}
并希望获得输出
<div class="prefix_0">
...
</div>
<section class="prefix_1">
...
</section>
<div class="prefix_2">
...
</div>
但是我明白了
<div class="prefix_0 prefix_1">
...
</div>
<section class="prefix_2 prefix_3 prefix_4">
...
</section>
<div class="prefix_5 prefix_6 prefix_7 prefix_8">
...
</div>
如果我加上条件
if(!in_array($paragraph->parentNode, $parents)) {
如我所见,它不起作用,因为我们没有数组,而是节点列表
那么如何避免添加相同的parent?
非常简单的功能来避免它:
function compareParentNode($compare_node,$parents){
foreach($parents as $parent){
if ($parent->isSameNode($compare_node)) return true;
}
return false;
}
使用:
$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
$parentNode = $paragraph->parentNode;
if (!compareParentNode($parentNode,$parents)){
$parents[] = $paragraph->parentNode;
}
}
查看更多isSameNode