Подтвердить что ты не робот

Предупреждение: 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
4b9b3361

Ответ 1

Чтобы испарить предупреждение, вы можете использовать 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);

Ответ 2

Я бы поспорил, что если вы посмотрите на источник 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>

Ответ 3

$dom->@loadHTML($html);

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

@$dom->loadHTML($html);

Ответ 4

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

Возможно, вы ищете

echo $dom->saveHTML();

Ответ 5

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

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

$dom->@loadHTML($html);

Ответ 6

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

DOMNodeList Object
(
)

Решение

  • Установите recover в значение true, а strictErrorChecking - false

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

Ответ 7

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

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

Ответ 8

$html = file_get_contents("http://www.somesite.com/");

$dom = new DOMDocument();
$dom->loadHTML(htmlspecialchars($html));

echo $dom;

попробуйте это

Ответ 9

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

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

Ответ 10

Я знаю, что это старый вопрос, но если вы когда-нибудь захотите, то исправьте искаженное '& amp;' знаки в вашем 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]+|[A-Z|a-z|0-9]+);/', $string) === 0) { // If a standard escape cannot be found.
            $html = substr_replace($html, '&amp;', $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.
        }
    }
}

Ответ 11

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

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

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

вместо

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

Ответ 12

Другое возможное решение, возможно, ваш файл является файлом типа ASCII, просто измените тип ваших файлов.