在php中检测远程charset

时间:2010-04-15 10:53:12

标签: php regex encoding preg-match

我想通过检测 Content-Type 标头标签确定远程网页的编码

<meta http-equiv="Content-Type" content="text/html; charset=XXXXX" />

如果有的话。

我检索远程页面并尝试使用正则表达式来查找所需的设置(如果存在)。 我还在学习下面的问题...... 这就是我所拥有的:

    $EncStart = 'charset=';
    $EncEnd = '" \/\>';
    preg_match( "/$EncStart(.*)$EncEnd/s", $RemoteContent, $RemoteEncoding );
    echo = $RemoteEncoding[ 1 ];

上面确实回应了编码的名称,但是它不知道在哪里停止,所以它打印出我的测试中剩下的大部分远程页面的剩余部分。 示例:在测试打印的远程俄语页面时:

  

windows-1251“/&gt;
  页面的其余部分......

这意味着$EncStart没问题,但正则表达式的$EncEnd部分未能停止匹配。这个元标题通常以编码名称后的3种不同的可能性结束。

"> | "/> | " />

我不知道天气这可以用来满足机器的结束,如果是,如何逃避它。我玩不同的方式,但都没有。

提前感谢您伸出援助之手。

2 个答案:

答案 0 :(得分:1)

在你的模式中添加一个问号,使其不贪婪(并且也不需要's')

preg_match( "/charset=\"(.+?)\"/", $RemoteContent, $RemoteEncoding );
echo $RemoteEncoding[ 1 ];

请注意,这不会处理charset = "..."charset='...'以及许多其他组合。

答案 1 :(得分:0)

看看Simple HTML Dom Parser。有了它,您可以轻松地从头部找到字符集,而无需使用繁琐的正则表达式。但正如大卫已经评论过的那样,您还应该检查the headers是否有相同的信息,如果找到则优先考虑它。

经过测试的例子:

require_once 'simple_html_dom.php';

$source = file_get_contents('http://www.google.com');
$dom = str_get_html($source);
$meta = $dom->find('meta[http-equiv=content-type]', 0);
$src_charset = substr($meta ->content, stripos($meta ->content, 'charset=') + 8);

foreach ($http_response_header as $header) {
    @list($name, $value) = explode(':', $header, 2);
    if (strtolower($name) == 'content-type') {
        $hdr_charset = substr($value, stripos($value, 'charset=') + 8);
        break;
    }
}

var_dump(
    $hdr_charset,
    $src_charset
);