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

如果我有一个iOS用户代理

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

要么

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

我如何检测使用正则expression式的iOS版本,以便它将返回例如

4

对于上面的用户代理?

正在为我工​​作的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 

如果没有findiOS版本,它将返回nil

这个正则expression式应该做你想要的:

 /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 

这个正则expression式将匹配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设备上进行testing。

这将在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_ . 使用.replace(/_/g,'.'); 或者甚至使用.split('_');将其转换为数组.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,'.'); 

我发现现有的答案没有一个很好的成功率,当对这个可能的用户代理string进行testing时,在这个例子用户代理string的网页上:

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

我创build了以下这些正则expression式,在对这些示例进行testing时获得了更多的成功:

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

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

有7个示例用户代理string不包含任何版本号,所以这些特定的不匹配。 有一个示例string,其中ios版本是“7.1”,但正则expression式只匹配主版本号“7”(这对我的用例来说已经足够了)

除上述页面上的testing外,还对本页面列出的ios10代理string进行了testing:

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