PHP LIBXML_NOWARNING不禁止警告?

use*_*001 5 php libxml2

使用PHPDOMDocument-> loadHTML加载html时,使用LIBXML_NOWARNING选项标志不会停止.其他常量确实有效.

在下面的示例中,我添加了LIBXML_HTML_NODEFDTD以证明已接收到常量(停止添加doctype).

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

但是,仍会生成警告并输出.我错过了什么?

Pra*_*yal 7

忽略该LIBXML_NOWARNING选项DOMDocument::loadHTML()PHP中的一个缺陷(并且要修复).它最近出现在一个相关问题"libxml htmlParseDocument忽略htmlParseOption标志"中,在loadHTML*上提交为PHP Bug#74004 LIBXML_NOWARNING标志.

但是,您可以管理自己的错误处理,直到删除缺陷为止:

  1. libxml_use_internal_errors(true)在打电话前设定DOMDocument::loadHTML.这将防止错误冒泡到您的默认错误处理程序.然后,您可以使用其他libxml错误函数(例如libxml_get_errors())获取它们(如果您愿意).
  2. 使用此功能时,请务必清除内部错误缓冲区.如果你不这样做,并且你在长时间运行的过程中使用它,你可能会发现你的所有内存都用完了.
  3. 如果要还原默认功能集libxml_use_internal_errors().

代码示例:

$doc = new DOMDocument();

# clear errors list if any
libxml_clear_errors();

# use internal errors, don't spill out warnings
$previous = libxml_use_internal_errors(true);

$doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>");
echo $doc->saveHTML();

# clear errors list if any
libxml_clear_errors();

# restore previous behavior
libxml_use_internal_errors($previous);
Run Code Online (Sandbox Code Playgroud)

更新

这个bug现在已修复.