$html = file_get_contents("http://www.somesite.com/");
$dom = new DOMDocument();
$dom->loadHTML($html);
echo $dom;
lanza
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()
o similar en la cadena solucionará el problema.Esto es incorrecto, use esto en su lugar:
fuente
@
de?Hay 2 errores: el segundo es porque $ dom no es una cadena sino un objeto y, por lo tanto, no se puede "hacer eco". El primer error es una advertencia de loadHTML, causado por una sintaxis no válida del documento html para cargar (probablemente un & (ampersand) usado como separador de parámetros y no enmascarado como entidad con &).
Usted ignora y suprime este mensaje de error (¡no el error, solo el mensaje!) Llamando a la función con el operador de control de errores "@" ( http://www.php.net/manual/en/language.operators.errorcontrol. php )
fuente
La razón de su error fatal es que DOMDocument no tiene un método __toString () y, por lo tanto, no se puede hacer eco.
Probablemente estas buscando
echo $dom->saveHTML();
fuente
Independientemente del eco (que debería ser reemplazado por print_r o var_dump), si se lanza una excepción, el objeto debe permanecer vacío:
DOMNodeList Object ( )
Solución
Establecer
recover
en verdadero ystrictErrorChecking
falso$content = file_get_contents($url); $doc = new DOMDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTML($content);
Use la codificación de entidad de php en el contenido del marcado, que es una fuente de error más común.
fuente
reemplazar lo simple
con los más robustos ...
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; }
fuente
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom;
prueba esto
fuente
Otra posible solución es
$sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML());
fuente
<span>Hello World</span>
. Ejecutar estohtmlspecialchars
producirá lo<span>Hello World</span>
que ya no es HTML. DOMDocument :: loadHTML ya no lo tratará como HTML sino como una cadena.$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
Sé que esta es una pregunta antigua, pero si alguna vez desea corregir los signos '&' mal formados en su HTML. Puede usar un código similar a este:
$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. } } }
fuente
Otra posible solución es que tal vez su archivo sea de tipo ASCII, simplemente cambie el tipo de sus archivos.
fuente
Incluso después de esto, mi código funciona bien, así que eliminé todos los mensajes de advertencia con esta declaración en la línea 1.
<?php error_reporting(E_ERROR); ?>
fuente