$html = file_get_contents("http://www.somesite.com/");
$dom = new DOMDocument();
$dom->loadHTML($html);
echo $dom;
lança
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 algo semelhante na string resolverá o problema.Isso está incorreto, use o seguinte:
fonte
@
?Existem 2 erros: o segundo é porque $ dom não é uma string, mas um objeto e, portanto, não pode ser "ecoado". O primeiro erro é um aviso de loadHTML, causado por sintaxe inválida do documento html a carregar (provavelmente um & ( comercial) usado como separador de parâmetro e não mascarado como entidade com &).
Você ignora e suprime essa mensagem de erro (não o erro, apenas a mensagem!) Chamando a função com o operador de controle de erro "@" ( http://www.php.net/manual/en/idioma.operators.errorcontrol. php )
fonte
O motivo do seu erro fatal é DOMDocument não tem um método __toString () e, portanto, não pode ser ecoado.
Você provavelmente está procurando por
echo $dom->saveHTML();
fonte
Independentemente do eco (que precisaria ser substituído por print_r ou var_dump), se uma exceção for lançada, o objeto deve permanecer vazio:
DOMNodeList Object ( )
Solução
Definido
recover
como verdadeiro estrictErrorChecking
falso$content = file_get_contents($url); $doc = new DOMDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTML($content);
Use a codificação de entidade do php no conteúdo da marcação, que é a fonte de erro mais comum.
fonte
substitua o simples
com o mais robusto ...
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; }
fonte
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom;
tente isso
fonte
Outra solução possível é
$sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML());
fonte
<span>Hello World</span>
. Executando isso emhtmlspecialchars
irá produzir<span>Hello World</span>
que não é mais HTML. DOMDocument :: loadHTML não o tratará mais como HTML, mas como uma string.$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
Eu sei que esta é uma pergunta antiga, mas se você quiser corrigir os sinais '&' malformados em seu HTML. Você pode usar um código semelhante 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. } } }
fonte
Outra solução possível é, talvez seu arquivo seja um arquivo do tipo ASCII, basta alterar o tipo de seus arquivos.
fonte
Mesmo depois disso, meu código está funcionando bem, então acabei de remover todas as mensagens de aviso com essa instrução na linha 1.
<?php error_reporting(E_ERROR); ?>
fonte