我需要解析一些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)
可以抑制警告,但是如何以编程方式捕获这些警告?
答案 0 :(得分:201)
呼叫
libxml_use_internal_errors(true);
在使用$xmlDoc->loadHTML()
进行处理之前
这告诉libxml2 not to send错误和警告到PHP。然后,要检查错误并自行处理,您可以在准备好后咨询libxml_get_last_error()和/或libxml_get_errors()。
答案 1 :(得分:87)
要隐藏警告,您必须向内部用于执行解析的libxml
提供特殊说明:
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();
libxml_use_internal_errors(true)
表示您将自己处理错误和警告,并且您不希望它们弄乱脚本的输出。
这与@
运算符不同。在幕后收集警告,之后您可以使用libxml_get_errors()
检索它们,以防您希望执行记录或将问题列表返回给调用者。
无论您是否使用收集的警告,都应该通过拨打libxml_clear_errors()
来清除队列。
保留状态
如果您有其他使用libxml
的代码,可能值得确保您的代码不会改变错误处理的全局状态;为此,您可以使用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);
答案 2 :(得分:14)
您可以使用set_error_handler
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());
}
答案 3 :(得分:5)
设置选项“ LIBXML_NOWARNING”和“ LIBXML_NOERROR”也可以很好地工作:
$dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR);