通过 DomDocument (PHP) 加载格式不正确的 HTML 时禁用警告

2022-08-30 08:00:22

我需要解析一些HTML文件,但是,它们的格式不正确,PHP会打印出警告。我想以编程方式避免这种调试/警告行为。请指教。谢谢!

法典:

// create a DOM document and load the HTML data
$xmlDoc = new DomDocument;
// this dumps out the warnings
$xmlDoc->loadHTML($fetchResult);

这:

@$xmlDoc->loadHTML($fetchResult)

可以抑制警告,但我如何以编程方式捕获这些警告?


答案 1

libxml_use_internal_errors(true);

在处理之前$xmlDoc->loadHTML()

这告诉libxml2不要将错误和警告发送到PHP。然后,要检查错误并自行处理,您可以在准备就绪时咨询libxml_get_last_error()和/或libxml_get_errors():

libxml_use_internal_errors(true);
$dom->loadHTML($html);
$errors = libxml_get_errors();
foreach ($errors as $error) {
    // handle the errors as you wish
}

答案 2

要隐藏警告,您必须提供内部用于执行解析的特殊说明:libxml

libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

libxml_use_internal_errors(true)表示您将自己处理错误和警告,并且您不希望它们弄乱脚本的输出。

这与运算符不同。警告在后台收集,之后您可以使用libxml_get_errors()检索它们,以防您希望执行日志记录或将问题列表返回给调用方。@

无论您是否正在使用收集的警告,都应始终通过调用libxml_clear_errors()来清除队列。

保留状态

如果您有其他代码使用它,则可能值得确保您的代码不会改变错误处理的全局状态;为此,您可以使用 返回值 来保存以前的状态。libxmllibxml_use_internal_errors()

// modify state
$libxml_previous_state = libxml_use_internal_errors(true);
// parse
$dom->loadHTML($html);
// handle errors
libxml_clear_errors();
// restore
libxml_use_internal_errors($libxml_previous_state);

推荐