$html = file_get_contents("http://www.somesite.com/");
$dom = new DOMDocument();
$dom->loadHTML($html);
echo $dom;
rzuca
Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
Catchable fatal error: Object of class DOMDocument could not be converted to string in test.php on line 10
htmlentities()
lub coś podobnego na łańcuchu rozwiąże problem.To jest niepoprawne, użyj zamiast tego:
źródło
@
za?Występują 2 błędy: drugi jest taki, że $ dom nie jest łańcuchem, ale obiektem i dlatego nie może być "powtórzonym". Pierwszy błąd to ostrzeżenie ze strony loadHTML, spowodowane nieprawidłową składnią dokumentu html do załadowania (prawdopodobnie znak & (ampersand) używany jako separator parametrów i niezamaskowany jako encja z &).
Ignorujesz i usuwasz ten komunikat o błędzie (nie błąd, tylko komunikat!), Wywołując funkcję z operatorem kontroli błędów „@” ( http://www.php.net/manual/en/language.operators.errorcontrol. php )
źródło
Przyczyną twojego krytycznego błędu jest to, że DOMDocument nie ma metody __toString () i dlatego nie może być powtórzony.
Prawdopodobnie szukasz
echo $dom->saveHTML();
źródło
Niezależnie od echa (które musiałoby zostać zastąpione przez print_r lub var_dump), jeśli zostanie wyrzucony wyjątek, obiekt powinien pozostać pusty:
DOMNodeList Object ( )
Rozwiązanie
Ustaw
recover
na true istrictErrorChecking
false$content = file_get_contents($url); $doc = new DOMDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTML($content);
Użyj kodowania encji php w treści znaczników, które jest najczęstszym źródłem błędów.
źródło
wymienić proste
z bardziej wytrzymałym ...
libxml_use_internal_errors(true); if (!$DOM->loadHTML($page)) { $errors=""; foreach (libxml_get_errors() as $error) { $errors.=$error->message."<br/>"; } libxml_clear_errors(); print "libxml errors:<br>$errors"; return; }
źródło
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom;
Spróbuj tego
źródło
Innym możliwym rozwiązaniem jest
$sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML());
źródło
<span>Hello World</span>
. Uruchomienie tego whtmlspecialchars
spowoduje, że<span>Hello World</span>
nie będzie to już HTML. DOMDocument :: loadHTML nie będzie już traktować go jako HTML, ale jako ciąg.$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
Wiem, że to stare pytanie, ale jeśli kiedykolwiek zechcesz naprawić zniekształcone znaki „&” w kodzie HTML. Możesz użyć kodu podobnego do tego:
$page = file_get_contents('http://www.example.com'); $page = preg_replace('/\s+/', ' ', trim($page)); fixAmps($page, 0); $dom->loadHTML($page); function fixAmps(&$html, $offset) { $positionAmp = strpos($html, '&', $offset); $positionSemiColumn = strpos($html, ';', $positionAmp+1); $string = substr($html, $positionAmp, $positionSemiColumn-$positionAmp+1); if ($positionAmp !== false) { // If an '&' can be found. if ($positionSemiColumn === false) { // If no ';' can be found. $html = substr_replace($html, '&', $positionAmp, 1); // Replace straight away. } else if (preg_match('/&(#[0-9]+|[A-Z|a-z|0-9]+);/', $string) === 0) { // If a standard escape cannot be found. $html = substr_replace($html, '&', $positionAmp, 1); // This mean we need to escape the '&' sign. fixAmps($html, $positionAmp+5); // Recursive call from the new position. } else { fixAmps($html, $positionAmp+1); // Recursive call from the new position. } } }
źródło
Innym możliwym rozwiązaniem jest to, że być może twój plik jest plikiem typu ASCII, po prostu zmień typ swoich plików.
źródło
Nawet po tym mój kod działa dobrze, więc właśnie usunąłem wszystkie komunikaty ostrzegawcze z tym stwierdzeniem w wierszu 1.
<?php error_reporting(E_ERROR); ?>
źródło