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