我想通过检测 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种不同的可能性结束。
"> | "/> | " />
我不知道天气这可以用来满足机器的结束,如果是,如何逃避它。我玩不同的方式,但都没有。
提前感谢您伸出援助之手。
答案 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
);