형식이 올바르지 않은 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
'programing' 카테고리의 다른 글
동적 계산 속성 이름 (0) | 2022.11.29 |
---|---|
YYYMMDD 형식으로 주어진 생년월일을 계산합니다. (0) | 2022.11.29 |
위치 설정: 고정 동작과 같은 고정 동작(Vue2의 경우) (0) | 2022.11.29 |
PHP에서 에코와 인쇄는 어떻게 다릅니까? (0) | 2022.11.29 |
TypeError: 시퀀스 항목 0: 필요한 문자열, int를 찾았습니다. (0) | 2022.11.29 |