【问题标题】:PHP domdocument is having unexpected value in endPHP domdocument 最终具有意想不到的价值
【发布时间】: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>

如上所示,上面第一个 &lt;li&gt; 的 HTML 没有关闭,而是关闭的 &lt;/li&gt; 出现在末尾。

【问题讨论】:

  • 如果您没有直接访问权限来修复&lt;li&gt;,请将其包装在一些独特的元素中,然后在 saveHTML 3v4l.org/XWSjJ 上删除
  • @LawrenceCherone 我实际上将&lt;ul class=""&gt;&lt;/ul&gt; 包裹在li 堆栈周围。我想删除它们,因为我正在测试一些 Dom 解析。现在我得到了这个
  • eek 抱歉,我的意思是 ul 不是 li,是的,如果你把它们包裹起来,那么就不会有问题 3v4l.org/idhHj domdocument 需要一个根元素

标签: php dom domdocument


【解决方案1】:

如果没有包含ul,则不能有li 的列表,这是描述为Element li not allowed as child of element body in this context 的DOM 错误。如果 HTML 无效,您的 PHP DOM 解析器将无法工作。

您只需将您的 HTML 包装在 ul 标记中,然后您的其余代码就可以工作了。

$str_val = '
<ul>
    <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>
</ul>';

【讨论】:

  • 原来的标记代码实际上已经包裹了&lt;ul class=""&gt;&lt;/ul&gt;,实际上我正在测试PHP Dom解析,所以 - 我虽然 - 让我们看看解析,然后在最终代码中,我将附上&lt;ul class=""&gt; @ 987654328@ - 所以我得到了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2020-07-27
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多