如果我有一个iOS的用户代理样
Mozilla的/ 5.0(iPhone; U; CPU iPhone OS 4_0,例如Mac OS X; EN-US)为AppleWebKit / 532.9(KHTML,例如Gecko)版本/ 4.0.5移动/ 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)手机/ 7D11
我将如何使用正则表达式,这样它会返回如发现iOS版
4
用于上述用户代理?
这是为我工作的正则表达式为:
/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"
因此,3号在iOS的版本 ,而不是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版本发现
这个正则表达式应该做你想要什么:
/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个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,'.');
我发现,当对例如用户代理字符串的这个网页上可能的用户代理字符串测试现有的答案,没有一个很好的成功率:
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或XYZ其中Y和Z是可选的。
有不包含任何版本号,以便那些特定的一些不匹配7个实施例的用户代理字符串。 有一个例子字符串,其中的IOS版本为“7.1”,但正则表达式只有主版本号“7”一致(这是我的使用情况不够好)
除了其也已针对此页面上列出的ios10代理字符串测试上述页面上的测试:
https://myip.ms/view/comp_browsers/1983/Safari_10.html