【发布时间】:2021-08-17 17:27:12
【问题描述】:
我正在尝试解析简单的 html 值,并使用 foreach 循环删除一个属性,而代码工作正常,但第一个元素的 DOMDocument 或 html 字符串关闭 </li> 标记从第一个元素中丢失项目。
第一个元素缺少的</li> 标记意外出现在最后一个元素中。
<?php
//remove id attributes and print string
$dom = new DOMDocument();
$str_val = '
<li class="nav-head">Salamandar</li>
<li id="12" class="natm"><a class="nlnk" href="#">How to P</a></li>
<li id="13" class="natm"><a class="nlnk" href="#">How to F</a></li>
<li id="14" class="natm"><a class="nlnk" href="#">Which Ca</a></li>
<li id="17" class="natm"><a class="nlnk" href="#">Types Sa</a></li>
<li id="19" class="natm"><a class="nlnk" href="#">Poiso Br</a></li>
<li class="nav-header">Keeping Safe</li>
<li id="21" class="natm"><a class="nlnk" href="#">Keepchld</a></li>
<li id="24" class="natm"><a class="nlnk" href="#">Keepdogs</a></li>
<li id="27" class="natm"><a class="nlnk" href="#">KeepRept</a></li>';
$dom->loadHTML($str_val, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
$li_tags = $dom->getElementsByTagName("li");
foreach($li_tags as $li_tag){
if(!(($li_tag->getAttribute("class") == "nav-header") || ($li_tag->getAttribute("class") == "nav-head"))){
$li_tag->removeAttribute("id");
}
}
$str_markval = $dom->saveHTML();
echo $str_markval;
?>
上面得到结果:
<li class="nav-head">Salamandar
<li class="natm"><a class="nlnk" href="#">How to P</a></li>
<li class="natm"><a class="nlnk" href="#">How to F</a></li>
...
<li class="nav-header">Keeping Safe</li>
...
<li class="natm"><a class="nlnk" href="#">Keepdogs</a></li>
<li class="natm"><a class="nlnk" href="#">KeepRept</a></li></li>
如上所示,上面第一个 <li> 的 HTML 没有关闭,而是关闭的 </li> 出现在末尾。
【问题讨论】:
-
如果您没有直接访问权限来修复
<li>,请将其包装在一些独特的元素中,然后在 saveHTML 3v4l.org/XWSjJ 上删除 -
@LawrenceCherone 我实际上将
<ul class=""></ul>包裹在li堆栈周围。我想删除它们,因为我正在测试一些 Dom 解析。现在我得到了这个 -
eek 抱歉,我的意思是
ul不是li,是的,如果你把它们包裹起来,那么就不会有问题 3v4l.org/idhHj domdocument 需要一个根元素
标签: php dom domdocument