programing

형식이 올바르지 않은 HTML by DomDocument(PHP)를 로드할 때 경고 사용 안 함

goodsources 2022. 11. 29. 21:48
반응형

형식이 올바르지 않은 HTML by DomDocument(PHP)를 로드할 때 경고 사용 안 함

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)

경고는 억제할 수 있지만 어떻게 하면 해당 경고를 프로그램적으로 캡처할 수 있습니까?

불러

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
}

경고를 숨기려면 다음 명령을 수행해야 합니다.libxml해석 실행에 내부적으로 사용됩니다.

libxml_use_internal_errors(true);
$dom->loadHTML($html);
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);

"LIBXML_NOWARNING" 및 "LIBXML_NOERROR" 옵션을 설정해도 완벽하게 작동합니다.

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

에러 핸들러를 일시적으로 인스톨 할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/1148928/disable-warnings-when-loading-non-well-formed-html-by-domdocument-php

반응형