DOMDocument:: loadHTML(): warning - htmlParseEntityRef: нет имени в Entity
Я нашел несколько похожих вопросов, но до сих пор никто не смог мне помочь.
Я пытаюсь вывести 'src' всех изображений в блоке HTML, поэтому я использую DOMDocument()
. Этот метод работает, но я получаю предупреждение на некоторых страницах, и я не могу понять, почему. Некоторые сообщения предполагали подавить предупреждение, но я бы скорее выяснил, почему создается предупреждение.
Предупреждение: DOMDocument:: loadHTML(): htmlParseEntityRef: нет имени в Объект, строка: 10
Один пример post->post_content
, который генерирует ошибку, -
On Wednesday 21st November specialist rights of way solicitor Jonathan Cheal of Dyne Drewett will be speaking at the Annual Briefing for Rural Practice Surveyors and Agricultural Valuers in Petersfield.
<br>
Jonathan is one of many speakers during the day and he is specifically addressing issues of public rights of way and village greens.
<br>
Other speakers include:-
<br>
<ul>
<li>James Atrrill, Chairman of the Agricultural Valuers Associates of Hants, Wilts and Dorset;</li>
<li>Martin Lowry, Chairman of the RICS Countryside Policies Panel;</li>
<li>Angus Burnett, Director at Martin & Company;</li>
<li>Esther Smith, Partner at Thomas Eggar;</li>
<li>Jeremy Barrell, Barrell Tree Consultancy;</li>
<li>Robin Satow, Chairman of the RICS Surrey Local Association;</li>
<li>James Cooper, Stnsted Oark Foundation;</li>
<li>Fenella Collins, Head of Planning at the CLA; and</li>
<li>Tom Bodley, Partner at Batcheller Monkhouse</li>
</ul>
Я могу опубликовать еще несколько примеров того, что post->post_content
содержит, если это было бы полезно?
Я временно разрешил доступ к сайту разработки, поэтому вы можете увидеть некоторые примеры [Примечание - ссылки больше не доступны, поскольку вопрос был дан ответ) -
Какие-нибудь советы по устранению этого? Спасибо.
$dom = new DOMDocument();
$dom->loadHTML(apply_filters('the_content', $post->post_content)); // Have tried stripping all tags but <img>, still generates warning
$nodes = $dom->getElementsByTagName('img');
foreach($nodes as $img) :
$images[] = $img->getAttribute('src');
endforeach;
Ответы
Ответ 1
Этот правильный ответ исходит из комментария от @lonesomeday.
Мое лучшее предположение заключается в том, что в HTML есть неэкспертированный амперсанд (&). Это заставит синтаксический анализатор думать, что мы находимся в ссылке на сущность (например, & copy;). Когда он добирается, он думает, что сущность завершена. Затем он понимает, что он не соответствует сущности, поэтому он отправляет предупреждение и возвращает содержимое в виде обычного текста.
Ответ 2
Как упомянуто здесь
Предупреждение: DOMDocument :: loadHTML(): htmlParseEntityRef: Ожидает & # 39 ;; & # 39; в сущности,
Вы можете использовать:
libxml_use_internal_errors(true);
см http://php.net/manual/en/function.libxml-use-internal-errors.php
Ответ 3
В конце концов я решил эту проблему правильно, используя приборку
// Configuration
$config = array(
'indent' => true,
'output-xhtml' => true,
'wrap' => 200);
// Tidy to avoid errors during load html
$tidy = new tidy;
$tidy->parseString($bill->bill_text, $config, 'utf8');
$tidy->cleanRepair();
$domDocument = new DOMDocument();
$domDocument->loadHTML(mb_convert_encoding($tidy, 'HTML-ENTITIES', 'UTF-8'));
Ответ 4
У меня нет репутации, чтобы оставить комментарий выше, но с помощью htmlspecialchars
решил эту проблему в моем случае:
$inputHTML = htmlspecialchars($post->post_content);
$dom = new DOMDocument();
$dom->loadHTML(apply_filters('the_content', $inputHTML)); // Have tried stripping all tags but <img>, still generates warning
$nodes = $dom->getElementsByTagName('img');
foreach($nodes as $img) :
$images[] = $img->getAttribute('src');
endforeach;
В моих целях я также использую strip_tags($inputHTML, "<strong><em><br>")
, поэтому все теги изображений также удаляются - я не уверен, что это будет проблемой в противном случае.
Ответ 5
просто замените "&" с "и" в вашей строке. сделайте это для всех остальных символов