Intereting Posts
Как разработать зависимый пакет композитора без необходимости совершать или публиковать изменения? PHP – сжимает статический файл css с помощью GZIP php soap client, ошибка от плохой wsdl? «Исключить исключение SoapFault: Не удалось подключиться к хосту" Как получить последнее поле в базе данных Mysql с помощью PHP? Функция загрузки изображений PHP, сохранение в каталоге, а затем возврат сохраненного URL-адреса изображения Как определить, не был ли найден контент в URL-адресе фида, используя SimpleXML и PHP Загрузить изображение с помощью jquery Обновление woocommerce Способ доставки через ajax Тестирование класса, вызывающего parent :: function? Интеграция API QuickBooks API (php) Symfony2: как добавить массив Entity Entity в FormBuilder array_unique для массивов внутри массива Многомерное умножение массива Как сгенерировать этот SQL-запрос, например сводную таблицу MYSQLI_NUM_ROWS ВСЕГДА ВОЗВРАЩЕНИЕ 0

Отключить предупреждения при загрузке неверно сформированного 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) 

может подавлять предупреждения, но как я могу зафиксировать эти предупреждения программно?

Вы можете установить временный обработчик ошибок с помощью 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(); 

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