PHP:具有Version / x.x.x的浏览器版本号user-agent(Safari和Opera)

前端之家收集整理的这篇文章主要介绍了PHP:具有Version / x.x.x的浏览器版本号user-agent(Safari和Opera)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个简单的类来检查用户代理是否为不兼容的浏览器显示警告.我正在做这个服务器端,我知道它可能是客户端.

Okey首先,我对写正则表达不太好.

我写了一个正则表达式,搜索小写浏览器名称后跟版本号.
我用一个像这样的数组做一个foreach():

  1. <?PHP
  2. $browsers = Array('msie','chrome','safari','firefox','opera');
  3.  
  4. foreach($browsers as $i => $browser)
  5. {
  6. $regex = "#({$browser})[/ ]([0-9.]*)#i";
  7.  
  8. if(preg_match($regex,$useragent,$matches))
  9. {
  10. echo "Browser: \"{$matches[0]}\",version: \"{$matches[1]}\"";
  11. }
  12. }
  13. ?>

这将产生:浏览器:“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文件..否则乔治的回答将是答案..

鉴于您的一些结果,这是有效的.它可能并非在所有情况下,但它会大大减少您的处理时间.

我使用单个正则表达式来提取版本:

  1. (?:version\/|(?:msie|chrome|safari|firefox|opera) )([\d.]+)

然后,由于您只搜索一些精确的字符串,您可以使用PHP的stripos()来检查浏览器字符串.

  1. <?PHP
  2. $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";
  3. $browsers = Array('msie','opera');
  4. preg_match("/(?:version\/|(?:msie|chrome|safari|firefox|opera) )([\d.]+)/i",$matches);
  5. $version = $matches[1];
  6. $browser = "";
  7. foreach($browsers as $b)
  8. {
  9. if (stripos($useragent,$b) !== false)
  10. {
  11. $browser = ucfirst($b);
  12. break;
  13. }
  14. }
  15. echo "$browser: $version";
  16. ?>

这样做的好处是立竿见影的:

>您不需要使用正则表达式多次测试useragent.
> stripos()在处理htan正则表达式时明显更快.

你也可以在这里玩正则表达式:http://regex101.com/r/lE6lI2

猜你在找的PHP相关文章