85

一部の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)

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

4

4 に答える 4

234

電話

libxml_use_internal_errors(true);

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

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

libxml_use_internal_errors(true);
$dom->loadHTML($html);
$errors = libxml_get_errors();
foreach ($errors as $error) {
    // handle the errors as you wish
}
于 2010-05-17T06:54:28.753 に答える
98

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);
于 2013-07-09T22:59:37.623 に答える
33

オプション「LIBXML_NOWARNING」および「LIBXML_NOERROR」の設定も完全に正常に機能します。

$dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR);
于 2018-08-03T06:50:30.513 に答える
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());
}
于 2009-07-19T00:39:39.757 に答える