web-dev-qa-db-ja.com

DomDocument(PHP)によって整形式でないHTMLをロードする際の警告を無効にします

いくつかの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)

警告を抑制することができますが、それらの警告をプログラムでキャプチャするにはどうすればよいですか?

73
Viet

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());
}
14
troelskn

コール

_libxml_use_internal_errors(true);
_

$xmlDoc->loadHTML()で処理する前

これは、libxml2 送信しない エラーと警告をPHPに伝えます。次に、エラーをチェックして自分で処理するには、準備ができたら libxml_get_last_error() および/または libxml_get_errors() を参照してください。

205
thomasrutter

警告を非表示にするには、解析を実行するために内部的に使用されるlibxmlに特別な指示を与える必要があります。

_libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();
_

libxml_use_internal_errors(true) は、エラーと警告を自分で処理し、スクリプトの出力を台無しにしたくないことを示します。

これは_@_演算子とは異なります。警告はバックグラウンドで収集され、その後、ロギングを実行したり、問題のリストを呼び出し元に返したりする場合に libxml_get_errors() を使用して警告を取得できます。

収集された警告を使用しているかどうかにかかわらず、常に libxml_clear_errors() を呼び出してキューをクリアする必要があります。

状態の保存

libxmlを使用する他のコードがある場合、コードがエラー処理のglobal状態を変更しないことを確認する価値があります。このために、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);
_
87
Ja͢ck

オプション「LIBXML_NOWARNING」と「LIBXML_NOERROR」の設定も完全に機能します。

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