Отключить предупреждения При загрузке неверно сформированного HTML с помощью 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)
может подавить предупреждения, но как я могу захватить эти предупреждения программно?
4 ответа:
вы можете установить временный обработчик ошибок с помощью
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()); }
вызов
libxml_use_internal_errors(true);
перед обработкой с
$xmlDoc->loadHTML()
это говорит libxml2 не посылать ошибки и предупреждения через PHP. Затем, чтобы проверить наличие ошибок и справиться с ними самостоятельно, вы можете проконсультироваться libxml_get_last_error () и/или libxml_get_errors () когда вы будете готовы.
чтобы скрыть предупреждения, вы должны дать специальные инструкции для
libxml
который используется внутренне для выполнения синтаксического анализа:libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors();
The
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);