問題点
- NULL: タグ構成記号の右側部分である > の直後にヌル文字が含まれると、それ以降の文字が消える。
- BOM: HEAD タグが消え、BODY タグ内に空の P タグが出現。それに続いて HEAD と BODY 内の要素が出力される。
環境 Docker の Lapi で入れたやつ
| PHP Version | 8.3.1 |
| cURL Information | 7.88.1 |
| DOM/XML API Version | 20031129 |
| libxml Version | 2.9.14 |
問題のコード
<?php
libxml_use_internal_errors(true);
$url = 'https://garihari.sakura.ne.jp/NULL.html';
#$url = 'https://garihari.sakura.ne.jp/BOM.html';
#$url = 'https://services.digital.go.jp/mynaportal/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, getenv('HTTP_USER_AGENT'));
$curl = curl_exec($ch);
$curl = mb_encode_numericentity($curl, [0x81, ~0, 0, ~0], mb_detect_encoding($curl, 'euc-jp, shift-jis, auto'));
$dom = new DOMDocument();
$dom->loadHTML($curl);
echo $dom->saveHTML($dom->documentElement);
追加すべきコード
$curl = str_replace(["", "\0"], '', $curl);