Ich muss einige HTML-Dateien analysieren, sie sind jedoch nicht wohlgeformt und PHP druckt Warnungen aus. Ich möchte ein solches Debugging- / Warnverhalten programmgesteuert vermeiden. Bitte beraten. Vielen Dank!
Code:
// create a DOM document and load the HTML data
$xmlDoc = new DomDocument;
// this dumps out the warnings
$xmlDoc->loadHTML($fetchResult);
Dies:
@$xmlDoc->loadHTML($fetchResult)
kann die Warnungen unterdrücken, aber wie kann ich diese Warnungen programmgesteuert erfassen?
php
html
warnings
domdocument
Viet
quelle
quelle
$dom->saveHTML()
um zu sehen, welche Art von Dokument libxml versucht, aus Ihrer$html
Eingabe zu machen . Normalerweise ist es ziemlich nah / ok.Antworten:
Sie können einen temporären Fehlerbehandler mit installieren
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; } }
Verwendung:
// 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()); }
quelle
libxml_use_internal_errors
an den Fehlerbehandler von PHP anschließen.libxml_use_internal_errors
Steuert, ob libxml2 sich an den PHP-Fehlerbehandler anschließt oder nicht. An welche Fehler denkst du?Anruf
libxml_use_internal_errors(true);
vor der Verarbeitung mit mit
$xmlDoc->loadHTML()
Dies weist libxml2 an, keine Fehler und Warnungen an PHP zu senden . Um dann nach Fehlern zu suchen und diese selbst zu behandeln, können Sie libxml_get_last_error () und / oder libxml_get_errors () konsultieren, wenn Sie bereit sind.
quelle
Um die Warnungen auszublenden, müssen Sie spezielle Anweisungen geben,
libxml
die intern für die Analyse verwendet werden:libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors();
Das
libxml_use_internal_errors(true)
zeigt an, dass Sie die Fehler und Warnungen selbst behandeln und nicht möchten, dass sie die Ausgabe Ihres Skripts durcheinander bringen.Dies ist nicht dasselbe wie der
@
Bediener. Die Warnungen werden hinter den Kulissen gesammelt und können anschließend abgerufen werden, indem Sielibxml_get_errors()
für den Fall, dass Sie eine Protokollierung durchführen oder die Liste der Probleme an den Anrufer zurücksenden möchten, diese verwenden .Unabhängig davon, ob Sie die gesammelten Warnungen verwenden oder nicht, sollten Sie die Warteschlange immer durch einen Anruf löschen
libxml_clear_errors()
.Den Staat erhalten
Wenn Sie anderen Code verwenden, der verwendet wird
libxml
, kann es sinnvoll sein, sicherzustellen, dass Ihr Code den globalen Status der Fehlerbehandlung nicht ändert . Dazu können Sie den Rückgabewert von verwendenlibxml_use_internal_errors()
, um den vorherigen Status zu speichern.// 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);
quelle
FALSE
undFALSE
dass eine spätere Einstellung diese Einstellung zerstören würde. Durch die Verwendung des vorherigen Rückgabewerts werden$libxml_previous_state
diese potenziellen Nebenwirkungen verhindert, da die ursprüngliche Konfiguration unabhängig von den Anforderungen dieses Ortes wiederhergestellt wurde. Dielibxml_use_internal_errors()
Einstellung ist global, daher lohnt es sich, vorsichtig zu sein.libxml_use_internal_errors(true)
, wartet es möglicherweise darauf, die aufgetretenen Fehler zu behandeln.Das Einstellen der Optionen "LIBXML_NOWARNING" und "LIBXML_NOERROR" funktioniert ebenfalls einwandfrei:
quelle