Okey首先,我对写正则表达不太好.
我写了一个正则表达式,搜索小写浏览器名称后跟版本号.
我用一个像这样的数组做一个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]}\""; } } ?>
这将产生:浏览器:“Firefox”,版本“23.0.6”.
我发现这适用于Firefox,MS IE和旧版本的Opera.但是,某些浏览器(如Safari和较新版本的Opera)具有不同的用户代理字符串,其中包含Version / x.x.x,即
只是为了给你一个想法,这里有3个用户代理字符串,我需要突出显示.
> Mozilla / 5.0(Macintosh; Intel Mac OS X 10_8_4)AppleWebKit / 536.30.1(KHTML,与Gecko一样)Version / 6.0.5 Safari / 536.30.1
> Mozilla / 5.0(兼容; MSIE 10.0; Windows NT 6.1; WOW64; Trident / 6.0)
> Opera / 9.80(Windows NT 6.0)Presto / 2.12.388版本/ 12.14
所以在以下每个人的逻辑中都是正确的:
>如果字符串中的版本号/ x.x.x是版本号.
>如果没有则Browsername / x.x.x是版本号.
此外,如果您查看上面的第一个和最后一个用户代理字符串,您可以看到版本可以在浏览器名称之前或之后.
有人可以帮我制作一个与preg_match()一起使用的正则表达式吗?我是否需要使用条件语句或是否可以搜索可选分组?我有点困惑..
谢谢!
编辑17-09-2013:我忘了提,我不想使用get_browser(),它使用一个巨大的库来检测浏览器功能等.我只需要一个简短的“白名单”的浏览器,应该采取一些毫秒而不是几百毫秒来读取浏览cap.ini文件..否则乔治的回答将是答案..
我使用单个正则表达式来提取版本:
(?:version\/|(?:msie|chrome|safari|firefox|opera) )([\d.]+)
然后,由于您只搜索一些精确的字符串,您可以使用PHP的stripos()来检查浏览器字符串.
<?PHP $useragent = "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"; $browsers = Array('msie','opera'); preg_match("/(?:version\/|(?:msie|chrome|safari|firefox|opera) )([\d.]+)/i",$matches); $version = $matches[1]; $browser = ""; foreach($browsers as $b) { if (stripos($useragent,$b) !== false) { $browser = ucfirst($b); break; } } echo "$browser: $version"; ?>
这样做的好处是立竿见影的:
>您不需要使用正则表达式多次测试useragent.
> stripos()在处理htan正则表达式时明显更快.
你也可以在这里玩正则表达式:http://regex101.com/r/lE6lI2