DOMDocument::loadHTML(): предупреждение - htmlParseEntityRef: в сущности нет имени


Я нашел несколько подобных вопросов, но до сих пор ни один из них не смог мне помочь.

Я пытаюсь вывести "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;
Author: David Gard, 2013-02-01

4 answers

Этот правильный ответ взят из комментария @lonesomeday.

Тогда мое лучшее предположение состоит в том, что где-то в HTML есть амперсанд (&) без ограничений. Это заставит синтаксический анализатор думать, что мы находимся в ссылке на сущность (например, ©). Когда он доходит до;, он думает, что сущность закончена. Затем он понимает, что то, что у него есть, не соответствует сущности, поэтому он отправляет предупреждение и возвращает содержимое в виде обычного текста.

 18
Author: David Gard, 2013-02-12 12:03:05

Как упоминалось здесь

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

Вы можете использовать:

libxml_use_internal_errors(true);

См. http://php.net/manual/en/function.libxml-use-internal-errors.php

 11
Author: Ka., 2017-05-23 12:34:18

У меня нет репутации, необходимой для того, чтобы оставить комментарий выше, но использование 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>"), поэтому все теги изображений также удалены - я не уверен, что в противном случае это было бы проблемой.

 0
Author: Good Idea, 2016-06-01 17:02:47

Просто замените "&" на "и" в вашей строке. сделайте это для всех остальных символов

 -6
Author: Mike, 2014-02-06 08:46:42