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
, если это будет полезно?
Я временно разрешил доступ к сайту разработки, поэтому вы можете увидеть некоторые примеры [Примечание - ссылки больше недоступны, так как на вопрос был дан ответ] -
- Ошибка - http://test.dynedrewett.com/specialist-solicitor-speaks-at-petersfield-update /
- Ошибок нет - http://test.dynedrewett.com/restrictive-covenants-in-employment-contracts /
Какие-нибудь советы о том, как это решить? Спасибо.
$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;
4 answers
Этот правильный ответ взят из комментария @lonesomeday.
Тогда мое лучшее предположение состоит в том, что где-то в HTML есть амперсанд (&) без ограничений. Это заставит синтаксический анализатор думать, что мы находимся в ссылке на сущность (например, ©). Когда он доходит до;, он думает, что сущность закончена. Затем он понимает, что то, что у него есть, не соответствует сущности, поэтому он отправляет предупреждение и возвращает содержимое в виде обычного текста.
Как упоминалось здесь
Предупреждение: DOMDocument::loadHTML(): htmlParseEntityRef: ожидает ';' в сущности,
Вы можете использовать:
libxml_use_internal_errors(true);
См. http://php.net/manual/en/function.libxml-use-internal-errors.php
У меня нет репутации, необходимой для того, чтобы оставить комментарий выше, но использование 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>")
, поэтому все теги изображений также удалены - я не уверен, что в противном случае это было бы проблемой.
Просто замените "&" на "и" в вашей строке. сделайте это для всех остальных символов