Last updated on 2019年3月11日
问题
对网页HTML进行简单信息提取,这里不使用正则而使用 PHP 内建对象 DOMDocument 来做分析。
在读取 HTML 片段
我是中文
时,出现中文乱码。
问题重现
一段 HTML如下:
我是中文
PHP代码如下:
$doc = new DOMDocument();
@$doc->loadHTML($html); // 这里直接$html变量代替
$chinese = $doc->getElementById('chinese');
$result = $doc->saveHTML($chinese);
print_r($result);
输出结果出现不可读乱码。
解决
由于 DOMDocument 的 loadHTML 会遵循 w3c 标准去识别,HTML 片段 缺少 meta 编码标签,所以出现乱码,可通过增加编码标签来修正。
$hackEncoding = '<?xml encoding="UTF-8">';
$doc = new DOMDocument();
@$doc->loadHTML($hackEncoding . $html); // 这里带上encode
$chinese = $doc->getElementById('chinese');
$result = $doc->saveHTML($chinese);
print_r($result);
注:网站不标准时会报 warning 错误,可使用 @ 来屏蔽错误