$html = file_get_contents("http://www.somesite.com/");
$dom = new DOMDocument();
$dom->loadHTML($html);
echo $dom;
jette
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()
ou similaire sur la chaîne résoudra le problème.Ceci est incorrect, utilisez ceci à la place:
la source
@
?Il y a 2 erreurs: la seconde est que $ dom n'est pas une chaîne mais un objet et ne peut donc pas être "écho". La première erreur est un avertissement de loadHTML, causé par une syntaxe invalide du document html à charger (probablement un & (esperluette) utilisé comme séparateur de paramètre et non masqué comme entité avec &).
Vous ignorez et supprimez ce message d'erreur (pas l'erreur, juste le message!) En appelant la fonction avec l'opérateur de contrôle d'erreur "@" ( http://www.php.net/manual/en/language.operators.errorcontrol. php )
la source
La raison de votre erreur fatale est que DOMDocument n'a pas de méthode __toString () et ne peut donc pas être renvoyé.
Vous recherchez probablement
echo $dom->saveHTML();
la source
Indépendamment de l'écho (qui devrait être remplacé par print_r ou var_dump), si une exception est levée, l'objet doit rester vide:
DOMNodeList Object ( )
Solution
Défini
recover
sur true etstrictErrorChecking
sur false$content = file_get_contents($url); $doc = new DOMDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTML($content);
Utilisez le codage d'entité de php sur le contenu du balisage, qui est une source d'erreur la plus courante.
la source
remplacer le simple
avec le plus robuste ...
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; }
la source
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom;
essaye ça
la source
Une autre solution possible est
$sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML());
la source
<span>Hello World</span>
. L'exécution de celahtmlspecialchars
produira<span>Hello World</span>
ce qui n'est plus HTML. DOMDocument :: loadHTML ne le traitera plus comme du HTML mais comme une chaîne.$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
Je sais que c'est une vieille question, mais si jamais vous ne voulez pas corriger les signes «&» mal formés dans votre HTML. Vous pouvez utiliser un code similaire à celui-ci:
$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. } } }
la source
Une autre solution possible est, peut-être que votre fichier est de type ASCII, changez simplement le type de vos fichiers.
la source
Même après cela, mon code fonctionne correctement, je viens donc de supprimer tous les messages d'avertissement avec cette instruction à la ligne 1.
<?php error_reporting(E_ERROR); ?>
la source