$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
htmlentities()
или аналогичный вызов в строке устранит проблему.Это неверно, используйте вместо этого:
источник
@
?Есть 2 ошибки: вторая из-за того, что $ dom - это не строка, а объект, и поэтому его нельзя "повторить". Первая ошибка - это предупреждение от loadHTML, вызванное недопустимым синтаксисом загружаемого html-документа (возможно, & (амперсанд), который используется как разделитель параметров и не замаскирован как объект с помощью &).
Вы игнорируете и подавляете это сообщение об ошибке (не ошибку, а просто сообщение!), Вызывая функцию с оператором контроля ошибок «@» ( http://www.php.net/manual/en/language.operators.errorcontrol. php )
источник
Причина вашей фатальной ошибки в том, что DOMDocument не имеет метода __toString () и поэтому не может быть отображен эхом.
Вы, наверное, ищете
echo $dom->saveHTML();
источник
Независимо от эха (которое необходимо заменить на 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 для содержимого разметки, что является наиболее распространенным источником ошибок.
источник
заменить простой
с более прочным ...
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; }
источник
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom->loadHTML(htmlspecialchars($html)); echo $dom;
попробуй это
источник
Другое возможное решение:
$sContent = htmlspecialchars($sHTML); $oDom = new DOMDocument(); $oDom->loadHTML($sContent); echo html_entity_decode($oDom->saveHTML());
источник
<span>Hello World</span>
. Выполнение этогоhtmlspecialchars
приведет к созданию,<span>Hello World</span>
который больше не является HTML. DOMDocument :: loadHTML больше не будет рассматривать его как HTML, а как строку.$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); 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, '&', $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. } } }
источник
Другое возможное решение: возможно, ваш файл является файлом типа ASCII, просто измените тип ваших файлов.
источник
Даже после этого мой код работает нормально, поэтому я просто удалил все предупреждающие сообщения с помощью этого оператора в строке 1.
<?php error_reporting(E_ERROR); ?>
источник