【问题标题】:PHP LIBXML_NOWARNING not suppressing warnings?PHP LIBXML_NOWARNING 不抑制警告?
【发布时间】:2017-06-10 05:32:56
【问题描述】:

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

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

【问题讨论】:

  • 会产生什么警告?
  • 在示例中, 不验证为可识别的 html 标记名称。在现实世界中,HTML 有时会以其他方式出现格式错误,从而产生解析错误。

标签: php libxml2


【解决方案1】:

LIBXML_NOWARNING option 被忽略,DOMDocument::loadHTML() 是 PHP 中的一个错误(待修复)。它最近在related question "libxml htmlParseDocument ignoring htmlParseOption flags" 中提出并归档为PHP Bug #74004 LIBXML_NOWARNING flag ingnored on loadHTML*

但是,您可以自行管理错误处理,直到错误得到修复:

  1. 在调用DOMDocument::loadHTML 之前设置libxml_use_internal_errors(true)。这将防止错误冒泡到您的默认错误处理程序。然后,您可以使用其他 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.

【讨论】:

  • +1 用于防止将警告写入输出的解决方案。但是,正如您所指出的,它并没有真正忽略它们;它只是悄悄地将它们存储在内存中。我很生气,我必须在内存中存储一​​些我明确不关心的东西。
  • @PrashantPokhriyal:赏金不是这样运作的。你的回答很好,我只是添加了一些额外的东西,没有什么可以添加作为它自己的答案。享受赏金。
猜你喜欢
  • 2011-12-28
  • 2012-07-13
  • 2013-05-08
  • 2020-02-15
  • 2014-01-20
  • 2011-03-31
  • 2019-10-22
  • 2014-12-19
  • 2021-12-27
相关资源
最近更新 更多