我如何从html获取html网页字符集编码为字符串而不是dom?

时间:2010-07-31 21:22:28

标签: php regex character-encoding

我怎样才能将html网页字符集从html编码为字符串而不是dom?

我得到这样的html字符串:

$html = file_get_contents($url);
preg_match_all (string pattern, string subject, array matches, int flags)

但我不知道正则表达式,我需要找到网页字符集(UTF-8 / windows-255 /等..) 谢谢,

3 个答案:

答案 0 :(得分:6)

的preg_match( '〜字符集=([ - 一个-Z0-9 _] +)〜I',$ HTML,$字符集);

答案 1 :(得分:1)

首先,您必须检查内容类型标题。

//add error handling
$f = fopen($url, "r");
$md = stream_get_meta_data($f);
$wd = $md["wrapper_data"];
foreach($wd as $response) {
    if (preg_match('/^content-type: .+?/.+?;\\s?charset=([^;"\\s]+|"[^;"]+")/i',
             $response, $matches) {
         $charset = $matches[1];
         break;
    }
}
$data = stream_get_contents($f);

然后,您可以回退meta元素。这已在here之前得到解答。

标题解析的更复杂版本以取悦观众:

if (preg_match('~^content-type: .+?/[^;]+?(.*)~i', $response, $matches)) {
    if (preg_match_all('~;\\s?(?P<key>[^()<>@,;:\"/[\\]?={}\\s]+)'.
            '=(?P<value>[^;"\\s]+|"[^;"]+")\\s*~i', $matches[1], $m)) {
        for ($i = 0; $i < count($m['key']); $i++) {
            if (strtolower($m['key'][$i]) == "charset") {
                $charset = trim($m['value'][$i], '"');
            }
        }
    }
}

答案 2 :(得分:0)

可以使用

mb_detect_encoding($html);

但这通常是一个坏主意。最好使用curl,然后查看Content-Type标题。