Предупреждение: DOMDocument :: loadHTML (): htmlParseEntityRef: ожидается ';' в Entity,

$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML($html); echo $dom; 

бросает

 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 

Чтобы испарить предупреждение, вы можете использовать libxml_use_internal_errors(true)

 // create new DOMDocument $document = new \DOMDocument('1.0', 'UTF-8'); // set error level $internalErrors = libxml_use_internal_errors(true); // load HTML $document->loadHTML($html); // Restore error level libxml_use_internal_errors($internalErrors); 

Я бы поспорил, что если вы посмотрите на источник http://www.somesite.com/ вы найдете специальные символы, которые не были преобразованы в HTML. Может быть, что-то вроде этого:

 <a href="/script.php?foo=bar&hello=world">link</a> 

Должно быть

 <a href="/script.php?foo=bar&amp;hello=world">link</a> 
 $dom->@loadHTML($html); 

Это неверно, используйте вместо этого:

 @$dom->loadHTML($html); 

Причиной вашей фатальной ошибки является то, что DOMDocument не имеет метода __toString () и поэтому не может быть эхо-кодом.

Вы, вероятно, ищете

 echo $dom->saveHTML(); 

Есть 2 ошибки: вторая из-за того, что $ dom не является строкой, а объектом и, следовательно, не может быть «эхом». Первая ошибка – это предупреждение от loadHTML, вызванное недействительным синтаксисом html-документа для загрузки (вероятно, & & используется как разделитель параметров и не замаскировано как entity с &).

Вы игнорируете и подавляете это сообщение об ошибке (а не сообщение об ошибке!), Вызывая функцию с помощью оператора управления ошибкой «@» ( http://www.php.net/manual/en/language.operators.errorcontrol. php )

 $dom->@loadHTML($html); 

Независимо от эха (который нужно будет заменить print_r или var_dump), если возникает исключение, объект должен оставаться пустым:

 DOMNodeList Object ( ) 

Решение

  1. Установите recover в true и strictErrorChecking на false

     $content = file_get_contents($url); $doc = new DOMDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTML($content); 
  2. Используйте кодировку сущности php в содержимом разметки, которая является наиболее распространенным источником ошибок.

замените простой

 $dom->loadHTML($html); 

с более надежными …

 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; } 

Другим возможным решением является

 $sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML()); 

Я знаю, что это старый вопрос, но если вы когда-нибудь захотите исправить неправильные знаки «&» в своем HTML. Вы можете использовать код, похожий на этот:

 $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, '&amp;', $positionAmp, 1); // Replace straight away. } else if (preg_match('/&(#[0-9]+|[AZ|az|0-9]+);/', $string) === 0) { // If a standard escape cannot be found. $html = substr_replace($html, '&amp;', $positionAmp, 1); // This mean we need to escapa the '&' sign. fixAmps($html, $positionAmp+5); // Recursive call from the new position. } else { fixAmps($html, $positionAmp+1); // Recursive call from the new position. } } } 

Это не всегда из-за содержимого страницы и может быть из-за самого URL-адреса .

Недавно я столкнулся с этой ошибкой, и в конце URL-адреса был возвращен символ каретки. Причиной существования этого персонажа была ошибка в расщеплении URL-адресов.

 $urls_array = explode("\r\n", $urls); 

вместо

 $urls_array = explode("\n", $urls); 
 $html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom; 

попробуй это