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