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

Ответ 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

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