通过DomDocument(PHP)加载非格式良好的HTML时禁用警告

我需要parsing一些HTML文件,但是,它们不是格式良好的,PHP会输出警告。 我想以编程方式避免这种debugging/警告行为。 请指教。 谢谢!

码:

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

这个:

 @$xmlDoc->loadHTML($fetchResult) 

可以抑制警告,但我怎样才能以编程方式捕捉这些警告?

你可以用set_error_handler来安装一个临时的error handling程序

 class ErrorTrap { protected $callback; protected $errors = array(); function __construct($callback) { $this->callback = $callback; } function call() { $result = null; set_error_handler(array($this, 'onError')); try { $result = call_user_func_array($this->callback, func_get_args()); } catch (Exception $ex) { restore_error_handler(); throw $ex; } restore_error_handler(); return $result; } function onError($errno, $errstr, $errfile, $errline) { $this->errors[] = array($errno, $errstr, $errfile, $errline); } function ok() { return count($this->errors) === 0; } function errors() { return $this->errors; } } 

用法:

 // create a DOM document and load the HTML data $xmlDoc = new DomDocument(); $caller = new ErrorTrap(array($xmlDoc, 'loadHTML')); // this doesn't dump out any warnings $caller->call($fetchResult); if (!$caller->ok()) { var_dump($caller->errors()); } 

呼叫

 libxml_use_internal_errors(true); 

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

这告诉libxml2 不要向PHP 发送错误和警告。 然后,为了检查错误并自己处理,可以在准备就绪时参考libxml_get_last_error()和/或libxml_get_errors() 。

为了隐藏警告,你必须给libxml特别的指示,这是在内部使用来执行parsing:

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

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

这与@运算符不一样。 警告会在幕后收集,之后您可以使用libxml_get_errors()来检索警告,以防您执行日志logging或将问题列表返回给调用者。

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

保持国家

如果您有使用libxml其他代码,则可能值得确保您的代码不会改变error handling的全局状态; 为此,您可以使用libxml_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);