PHP LIBXML_NOWARNING不禁止警告?

问题描述 投票:5回答:1

使用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();

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

php libxml2
1个回答
7
投票

使用LIBXML_NOWARNING option忽略DOMDocument::loadHTML()是PHP中的缺陷(并且需要修复)。它最近在related question "libxml htmlParseDocument ignoring htmlParseOption flags"长大,并作为PHP Bug #74004 LIBXML_NOWARNING flag ingnored on loadHTML*提交。

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

  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);

更新

This bug is fixed now

© www.soinside.com 2019 - 2024. All rights reserved.