Necesito analizar algunos archivos HTML, sin embargo, no están bien formados y PHP imprime advertencias en. Quiero evitar tal comportamiento de depuración / advertencia mediante programación. Por favor avise. ¡Gracias!
Código:
// create a DOM document and load the HTML data
$xmlDoc = new DomDocument;
// this dumps out the warnings
$xmlDoc->loadHTML($fetchResult);
Esta:
@$xmlDoc->loadHTML($fetchResult)
puedo suprimir las advertencias, pero ¿cómo puedo capturar esas advertencias mediante programación?
php
html
warnings
domdocument
Viet
fuente
fuente
$dom->saveHTML()
para ver de qué tipo si el documento libxml está tratando de hacer con su$html
entrada, generalmente está bastante cerca / bien.Respuestas:
Puede instalar un controlador de errores temporal con
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; } }
Uso:
// 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()); }
fuente
libxml_use_internal_errors
conecta al controlador de errores de php.Llamada
libxml_use_internal_errors(true);
antes de procesar con con
$xmlDoc->loadHTML()
Esto le dice a libxml2 que no envíe errores y advertencias a PHP. Luego, para verificar si hay errores y manejarlos usted mismo, puede consultar libxml_get_last_error () y / o libxml_get_errors () cuando esté listo.
fuente
Para ocultar las advertencias, hay que dar instrucciones especiales a las
libxml
que se utilizan internamente para realizar el análisis:libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors();
El
libxml_use_internal_errors(true)
indica que usted mismo manejará los errores y las advertencias y no quiere que arruinen la salida de su script.Este no es el mismo que el
@
operador. Las advertencias se recopilan detrás de escena y luego puede recuperarlaslibxml_get_errors()
en caso de que desee realizar el registro o devolver la lista de problemas a la persona que llama.Ya sea que esté usando las advertencias recopiladas o no, siempre debe despejar la cola llamando
libxml_clear_errors()
.Preservando el estado
Si tiene otro código que lo use
libxml
, puede ser útil asegurarse de que su código no altere el estado global del manejo de errores; para esto, puede usar el valor de retorno delibxml_use_internal_errors()
para guardar el estado anterior.// 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);
fuente
FALSE
y configurarloFALSE
después destruiría esa configuración. Al utilizar el valor de retorno anterior,$libxml_previous_state
se evitan esos posibles efectos secundarios porque la configuración original se ha restaurado independientemente de las necesidades de este lugar. Ellibxml_use_internal_errors()
entorno es global, por lo que vale la pena tener cuidado.libxml_use_internal_errors(true)
, entonces puede estar esperando para manejar cualquier error que haya surgido.Establecer las opciones "LIBXML_NOWARNING" y "LIBXML_NOERROR" también funciona perfectamente bien:
$dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR);
fuente