PHP LIBXML_NOWARNING无法抑制警告?

6

使用 LIBXML_NOWARNING 选项标志不能在使用 PHPDOMDocument->loadHTML 加载 HTML 时停止警告,尽管其他常量确实有效。

在下面的示例中,我添加了 LIBXML_HTML_NODEFDTD 来证明已接收到这些常量(阻止添加文档类型声明)。

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

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

生成了哪些警告? - Prashant Pokhriyal
在这个例子中,<tagdoesnotexist> 无法作为一个被认可的 HTML 标签名进行验证。在现实世界中,HTML 有时会以其他方式存在格式错误,从而产生解析错误。 - user2782001
1个回答

11
LIBXML_NOWARNING选项在使用DOMDocument::loadHTML()时会被忽略,这是 PHP 中的一个错误(将来会修复)。最近在一个相关问题 "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);

更新

此错误已经修复


对于一个可以防止警告被写入输出的解决方案,我给予+1。然而正如你所指出的那样,它并没有真正地忽略这些警告,只是在内存中静默地存储它们。我感到烦恼的是,我必须将一些我明确不关心的东西存储在内存中。 - user2782001
1
@PrashantPokhriyal:赏金不是这样工作的。你的答案很好,我只是添加了一些额外的东西,没有什么可以作为答案单独添加的。享受这份赏金吧。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接