Мне нужно проанализировать некоторые файлы 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)
можно подавить предупреждения, но как я могу записать эти предупреждения программно?
php
html
warnings
domdocument
Вьетнам
источник
источник
$dom->saveHTML()
чтобы посмотреть, какой тип документа libxml пытается сделать из вашего$html
ввода, обычно это довольно близко / хорошо.Ответы:
Вы можете установить временный обработчик ошибок с помощью
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
подключается к обработчику ошибок php.Вызов
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);
источник
FALSE
и установка егоFALSE
впоследствии разрушила бы этот параметр. Использование предыдущего возвращаемого значения$libxml_previous_state
предотвращает эти потенциальные побочные эффекты, поскольку исходная конфигурация была восстановлена независимо от потребностей этого места.libxml_use_internal_errors()
Установка является глобальной, так что стоит взять какую - то помощь.libxml_use_internal_errors(true)
, то оно может ожидать обработки возникших ошибок.Установка параметров "LIBXML_NOWARNING" и "LIBXML_NOERROR" тоже отлично работает:
$dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR);
источник