環境
事象が発生した環境は以下のとおりです。
- 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();
コメント