通过加载的DomDocument非结构良好的HTML时禁用警告(PHP)(Disable warni

2019-06-17 10:42发布

我需要解析某些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)

可以抑制警告,但我怎么能编程捕获这些警告?

Answer 1:

您可以安装一个临时的错误处理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());
}


Answer 2:

呼叫

libxml_use_internal_errors(true);

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

这告诉libxml2的不发送通过错误和警告到PHP。 然后,检查错误,并自己处理它们,你可以咨询libxml_get_last_error()和/或libxml_get_errors()当你准备好了。



Answer 3:

要隐藏警告,你必须给特殊说明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);


Answer 4:

设置选项“LIBXML_NOWARNING”和“LIBXML_NOERROR”工作完全没有太:

$dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR);


文章来源: Disable warnings when loading non-well-formed HTML by DomDocument (PHP)