html5标签上的PHP DOMDocument错误/警告

Kla*_*ers 100 php html5 domdocument

我一直在尝试解析HTML5代码,所以我可以在代码中设置属性/值,但似乎DOMDocument(PHP5.3)不支持像<nav>和的标签<section>.

有没有办法在PHP中解析这个HTML并操纵代码?


代码重现:

<?php
$dom = new DOMDocument();
$dom->loadHTML("<!DOCTYPE HTML>
<html><head><title>test</title></head>
<body>
<nav>
  <ul>
    <li>first
    <li>second
  </ul>
</nav>
<section>
  ...
</section>
</body>
</html>");
Run Code Online (Sandbox Code Playgroud)

错误

警告:DOMDocument :: loadHTML():实体中的标签导航无效,第17行/home/wbkrnl/public_html/new-mvc/1.php中的第4行:

警告:DOMDocument :: loadHTML():实体中的标记部分无效,第17行/home/wbkrnl/public_html/new-mvc/1.php中的第10行:

lon*_*day 174

不,无法指定要使用的特定文档类型,也无法修改现有文档类型的要求.

您最好的解决方案是使用以下方法禁用错误报告libxml_use_internal_errors:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML('...');
libxml_clear_errors();
Run Code Online (Sandbox Code Playgroud)

  • 任何原因__*php7*__的内置DOM解析器_still_都无法处理HTML5?这个答案提交已经6年了. (12认同)
  • ---更不用说HTML5也不是XML,从不曾经,曾经,也不会…… (4认同)
  • Ops,对我来说 `loadHTML($HTML5)` 返回 FALSE(失败)!我需要将新标签更改为 DIV... (2认同)
  • @SuperCat这一切都依赖于底层的libxml库。 (2认同)
  • **2019 年更新**:警告仍然会被触发,但是 `loadHTML` 现在实际上接受 HTML5 标签。 (2认同)
  • **2022** *仍然*不支持 HTML 5(在 Windows 上使用 PHP 8.2 进行测试)。但是,没有人提到“LIBXML_NOERROR”选项? (2认同)

Ilk*_*tlu 8

你也可以这样做

@$dom->loadHTML($htmlString);
Run Code Online (Sandbox Code Playgroud)

  • 错误抑制不是处理此问题的正确方法. (15认同)
  • @KlaasSangers直到我们有一个非残缺的DOM实现,我担心它(通过`@`或`libxml_*`) (6认同)
  • 是的,在这种特殊情况下,在我看来,错误抑制是最好的解决方案.除非您知道要加载的HTML,否则应该是每个PHP定义的100%有效HTML.根据我的经验,从来都不是这样. (6认同)
  • PHP8“@ 运算符不再消除致命错误。此更改可能会揭示 PHP 8 之前隐藏的错误。请确保在生产服务器上设置 display_errors=Off!” https://stitcher.io/blog/new-in-php-8 (4认同)

hal*_*fer 6

您可以过滤从解析器获得的错误.根据此处的其他答案,关闭错误报告到屏幕,然后遍历错误并仅显示您想要的错误:

libxml_use_internal_errors(TRUE);
// Do your load here
$errors = libxml_get_errors();

foreach ($errors as $error)
{
    /* @var $error LibXMLError */
}
Run Code Online (Sandbox Code Playgroud)

这是一个print_r()错误:

LibXMLError Object
(
    [level] => 2
    [code] => 801
    [column] => 17
    [message] => Tag section invalid

    [file] => 
    [line] => 39
)
Run Code Online (Sandbox Code Playgroud)

通过匹配message和/或code,这些可以很容易地过滤掉.


use*_*001 5

似乎没有办法消除警告,但不能消除错误。PHP 有一些常量应该可以做到这一点,但它们似乎不起作用。这是应该起作用的,但不起作用是因为(错误?)....

 $doc=new DOMDocument();
 $doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING );
 echo $doc->saveHTML();
Run Code Online (Sandbox Code Playgroud)

http://php.net/manual/en/libxml.constants.php