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