使用正则表达式从用户代理检测iOS版本号

时间:2012-06-23 18:21:01

标签: ios regex version

如果我有像

这样的iOS用户代理
  

Mozilla / 5.0(iPhone; U; CPU iPhone OS 4_0,如Mac OS X; en-us)AppleWebKit / 532.9(KHTML,类似Gecko)版本/ 4.0.5 Mobile / 8A293 Safari / 6531.22.7

  

Mozilla / 5.0(iPhone; U; CPU iPhone OS 4_0,如Mac OS X; en-us)AppleWebKit / 532.9(KHTML,如Gecko)Mobile / 7D11

我如何使用正则表达式检测iOS版本,以便返回例如。

  

4.0

对于上述用户代理?

4 个答案:

答案 0 :(得分:10)

为我工作的RegEx是:

/OS ((\d+_?){2,3})\s/

iPad 5.1.1有HTTP_USER_AGENT这样:

"Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"

所以 iOS版本中的3个数字不是iPhone OS

可能的Ruby实现可能是:

def version_from_user_agent(user_agent)
  version = user_agent.match(/OS ((\d+_?){2,3})\s/)
  version = version[1].gsub("_",".") if version && version[1]
end

如果未找到iOS版本,则返回 nil

答案 1 :(得分:5)

这个正则表达式应该符合你的要求:

/iPhone OS (\d+)_(\d+)\s+/

您必须捕获两个匹配的组值,如何操作取决于您使用的语言...

使用php,你可以这样做:

$txt = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7';
$reg = '/iPhone OS (\d+)_(\d+)\s+/';
$a   = array();
preg_match($reg, $txt, $a);

$str_version = $a[1].'.'.$a[2]; // This variable should now contain : 4.0 

答案 2 :(得分:4)

此正则表达式将匹配2和3段,如4.0或6.1.3

/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/

Javascript示例:

> navigator.userAgent
  "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146"
> navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/);
  ["6_1_2"]

请注意,这也可能与其他设备匹配,因此请务必在iOS设备上进行测试。

这将返回Mac上的OS X版本。

> navigator.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"
> navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/);
  ["10_8_4"]

您还可以使用_.替换为.replace(/_/g,'.');,或者使用.split('_');将其转换为数组。

_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/);
if(_iOSDevice)
 _iOSVersion = (navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/)||[''])[0].replace(/_/g,'.');

答案 3 :(得分:0)

我发现在针对示例用户代理字符串的此网页上可能的用户代理字符串进行测试时,现有答案的成功率并不高:

http://www.webapps-online.com/online-tools/user-agent-strings/dv/operatingsystem51849/ios

我创建了以下正则表达式,在针对这些示例进行测试时取得了更大的成功:

(iPad|iPhone|iphone|iPod).*?(OS |os |OS\_)(\d+((_|\.)\d)?((_|\.)\d)?)

第四组包含ios版本号,格式为x_y_z或x.y.z,其中y和z是可选的。

有7个示例用户代理字符串,它们不包含任何版本号,因此这些特定的字符串不匹配。有一个示例字符串,其中ios版本为" 7.1"但正则表达式只匹配主要版本号" 7" (这对我的用例来说已经足够了)

除了上面的测试外,它还针对本页列出的ios10代理字符串进行了测试:

https://myip.ms/view/comp_browsers/1983/Safari_10.html