我编写了一个简单的类来检查用户代理以显示不兼容浏览器的警告。我正在做这个服务器端,我知道它可能是客户端。
好吧,首先,我不太擅长编写正则表达式..
我写了一个正则表达式,它搜索小写浏览器名称,后跟版本号。我用这样foreach()
的数组做一个:
<?php
$browsers = Array('msie','chrome','safari','firefox','opera');
foreach($browsers as $i => $browser)
{
$regex = "#({$browser})[/ ]([0-9.]*)#i";
if(preg_match($regex, $useragent, $matches))
{
echo "Browser: \"{$matches[0]}\", version: \"{$matches[1]}\"";
}
}
?>
这将产生:Browser: "Firefox", version "23.0.6"
.
我发现这适用于 Firefox、MS IE 和旧版本的 Opera。然而,一些浏览器,如 Safari 和较新版本的 Opera,有一个不同的用户代理字符串,其中包含 Version/xxx,即
只是为了给你一个想法,这里有 3 个用户代理字符串,我需要的是突出显示的。
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14
因此,在其中的每一个中,以下人类逻辑都是正确的:
- 如果字符串中有一个版本号。
Version/x.x.x
- 如果没有,则为版本号。
Browsername/x.x.x
此外,如果您查看上面的第一个和最后一个用户代理字符串,您可以看到可以出现在浏览器名称Version
之前或之后。
有人可以帮我制作一个正则表达式来使用preg_match()
吗?我需要使用条件语句还是可以搜索可选分组?我有点困惑。。
谢谢!
编辑 17-09-2013:我忘了提,我不想使用get_browser()
,它使用一个巨大的库来检测浏览器功能等。我只需要一个简短的浏览器“白名单”,这应该需要几毫秒而不是几百毫秒来阅读浏览 cap.ini 文件。否则乔治的答案就是答案。