以下是我编写的一个函数,它可以解决使用 loadHTML 和 DOM 函数时关于字符集问题(UTF-8...)的先前评论。
它在 <head> 之后添加 charset meta 标签,以改进自动编码检测,并将任何特定字符转换为 html 实体,因此 PHP DOM 函数/属性将返回正确的值。
<?php
mb_detect_order("ASCII,UTF-8,ISO-8859-1,windows-1252,iso-8859-15");
function loadNprepare($url,$encod='') {
$content = file_get_contents($url);
if (!empty($content)) {
if (empty($encod))
$encod = mb_detect_encoding($content);
$headpos = mb_strpos($content,'<head>');
if (FALSE=== $headpos)
$headpos= mb_strpos($content,'<HEAD>');
if (FALSE!== $headpos) {
$headpos+=6;
$content = mb_substr($content,0,$headpos) . '<meta http-equiv="Content-Type" content="text/html; charset='.$encod.'">' .mb_substr($content,$headpos);
}
$content=mb_convert_encoding($content, 'HTML-ENTITIES', $encod);
}
$dom = new DomDocument;
$res = $dom->loadHTML($content);
if (!$res) return FALSE;
return $dom;
}
?>
注意:它使用 mb_strpos/mb_substr 而不是 mb_ereg_replace,因为在处理大型 html 页面时,这似乎效率更高。