DOMDocument::loadHTML(): htmlParseEntityRef: expecting ‘;’ in Entity, line: ●

php
スポンサーリンク

環境

事象が発生した環境は以下のとおりです。

  • PHP 7.2
  • Laravel Framework 7.30.4

Laravelは関係なく、PHPの事象ですが、一応Laravelのバージョンも載せておきます。

事象

外部サイトのHTMLを取得してパースするプログラムを組んでいる途中です。

DOMDocumentを含むコードをLaravel の Command で実行した際に以下のメッセージを出力しました。

   ErrorException

  DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 6

原因

原因は、取得したHTMLコードの中にHTML特殊文字である「?」や「<」が含まれていたためです。

「line: 6」

と、エラーメッセージに書かれていますが、これは、取得したHTMLソースの6行目に該当の文字列があったということです。

対処

HTML特殊文字をエスケープしなければなりません。

PHPに用意されている関数の

  • htmlspecialchars()

を使用します。

例)

$html = '

<div>Hello & World</div>

';      // 「&」が含まれているHTMLソースコード
$escaped_html = htmlspecialchars($html, ENT_QUOTES);   // エスケープ
$dom = new DOMDocument();
$dom->loadHTML($escaped_html);

DOMDocumentのプログラムコードの場合、

        $html = file_get_contents('URL');

↑でhtmlソースを取得した後、
DOMDocument()にhtmlソースを食わせる前に、

        $domDocument = new DOMDocument();

の間にエスケープコードを入れる感じですね。

例)

        $html = file_get_contents('URL');
        $escaped_html = htmlspecialchars($html, ENT_QUOTES);
        $domDocument = new DOMDocument();

コメント