Muszę przeanalizować niektóre pliki HTML, jednak nie są one poprawnie sformułowane i PHP wyświetla ostrzeżenia w formacie. Chcę programowo uniknąć takiego debugowania / ostrzegania. Proszę doradź. Dziękuję Ci!
Kod:
// create a DOM document and load the HTML data
$xmlDoc = new DomDocument;
// this dumps out the warnings
$xmlDoc->loadHTML($fetchResult);
To:
@$xmlDoc->loadHTML($fetchResult)
można pominąć ostrzeżenia, ale jak mogę programowo przechwytywać te ostrzeżenia?
php
html
warnings
domdocument
Viet
źródło
źródło
$dom->saveHTML()
aby zobaczyć, jakiego rodzaju, jeśli dokument libxml próbuje wprowadzić twoje$html
dane wejściowe, zwykle jest dość blisko / ok.Odpowiedzi:
Możesz zainstalować tymczasową obsługę błędów z
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; } }
Stosowanie:
// 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()); }
źródło
libxml_use_internal_errors
podłącza się do programu obsługi błędów php.Połączenie
libxml_use_internal_errors(true);
przed przetworzeniem w
$xmlDoc->loadHTML()
To mówi libxml2, aby nie wysyłał błędów i ostrzeżeń do PHP. Następnie, aby sprawdzić błędy i zająć się nimi samodzielnie, możesz skonsultować się z libxml_get_last_error () i / lub libxml_get_errors (), kiedy będziesz gotowy.
źródło
Aby ukryć ostrzeżenia, musisz podać specjalne instrukcje,
libxml
które są używane wewnętrznie do wykonywania analizy:libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors();
Symbol
libxml_use_internal_errors(true)
wskazuje, że sam poradzisz sobie z błędami i ostrzeżeniami i nie chcesz, aby zepsuły wyniki Twojego skryptu.To nie to samo, co
@
operator. Ostrzeżenia są zbierane za kulisami, a następnie możesz je odzyskać, używająclibxml_get_errors()
w przypadku, gdy chcesz wykonać rejestrację lub zwrócić listę problemów dzwoniącemu.Niezależnie od tego, czy używasz zebranych ostrzeżeń, czy nie, zawsze powinieneś wyczyścić kolejkę, dzwoniąc
libxml_clear_errors()
.Ochrona państwa
Jeśli masz inny kod, który używa
libxml
, warto upewnić się, że Twój kod nie zmienia globalnego stanu obsługi błędów; w tym celu możesz użyć zwracanej wartości,libxml_use_internal_errors()
aby zapisać poprzedni stan.// 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);
źródło
FALSE
a ustawienie goFALSE
później zniszczyłoby to ustawienie. Używając poprzedniej wartości zwracanej,$libxml_previous_state
zapobiega się tym potencjalnym skutkom ubocznym, ponieważ oryginalna konfiguracja została przywrócona niezależnie od potrzeb tego miejsca.libxml_use_internal_errors()
Ustawienie jest globalny, więc warto poświęcić trochę opieki.libxml_use_internal_errors(true)
, może czekać, aby obsłużyć wszelkie pojawiające się błędy.Ustawienie opcji „LIBXML_NOWARNING” i „LIBXML_NOERROR” również działa doskonale:
$dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR);
źródło