web-dev-qa-db-ja.com

DOMDocument :: loadHTML():警告-htmlParseEntityRef:エンティティに名前がありません

私はいくつかの同様の質問を見つけましたが、これまでのところ、誰も私を助けることができませんでした。

HTMLのブロック内のすべての画像の「src」を出力しようとしているので、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;
15
David Gard

この正解は@lonesomedayからのコメントから来ています。

私の最善の推測は、HTMLのどこかにエスケープされていないアンパサンド(&)があるということです。これにより、パーサーは、エンティティ参照(©など)にいると見なします。 ;に到達すると、エンティティは終了したと見なされます。次に、エンティティに準拠していないことを認識し、警告を送信してコンテンツをプレーンテキストとして返します。

19
David Gard

ここで述べたように

警告:DOMDocument :: loadHTML():htmlParseEntityRef:エンティティに ';'が必要です

あなたが使用することができます:

libxml_use_internal_errors(true);

http://php.net/manual/en/function.libxml-use-internal-errors.php を参照してください

14
Ka.

私は最終的にこの問題を正しい方法で解決しました

// 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'));
0
yoorock.fr

上記のコメントを残すために必要な評判はありませんが、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
Good Idea