tag parse name loadhtml leer ejemplo domelement php html warnings domdocument

parse - php dom document get element by tag name



Deshabilitar advertencias al cargar HTML no bien formado por DomDocument(PHP) (3)

Llamada

libxml_use_internal_errors(true);

antes del procesamiento 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.

Necesito analizar algunos archivos HTML, sin embargo, no están bien formados y PHP imprime advertencias. Quiero evitar dicho comportamiento de depuración / advertencia programáticamente. 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)

puede suprimir las advertencias, pero ¿cómo puedo capturar esas advertencias programáticamente?


Para ocultar las advertencias, debe dar instrucciones especiales a libxml que se usa internamente para realizar el análisis:

libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors();

libxml_use_internal_errors(true) indica que va a manejar los errores y las advertencias usted mismo y no quiere que arruinen el resultado de su script.

Esto no es lo mismo que el operador @ . Las advertencias se recopilan detrás de escena y luego puede recuperarlas utilizando libxml_get_errors() en caso de que desee realizar un registro o devolver la lista de problemas a la persona que llama.

Ya sea que esté utilizando o no las advertencias recopiladas, siempre debe borrar la cola llamando a libxml_clear_errors() .

Preservando el estado

Si tiene otro código que utiliza libxml , puede valer la pena asegurarse de que su código no altere el estado global del manejo de errores; para esto, puede usar el valor de retorno de libxml_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);


Puede instalar un controlador de error 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()); }