【问题标题】:Detecting iOS Version Number from User Agent using Regular Expressions使用正则表达式从用户代理检测 iOS 版本号
【发布时间】:2012-06-25 16:17:52
【问题描述】:

如果我有类似的 iOS 用户代理

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

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

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

4.0

对于上述用户代理?

【问题讨论】:

  • 你会用什么语言提取它?

标签: ios regex version


【解决方案1】:

这个正则表达式应该做你想做的:

/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 

【讨论】:

  • 非常感谢!如果我要在 PHP 中执行此操作,我会简单地在 preg_match 函数中使用上述模式吗?
  • 此解决方案将不再有效!仅适用于 iPhone 并且仅当 iOS 版本号仅包含两个部分而不是三个部分时。作为参考,这是最近的用户代理(iPad,8.1.3):Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4
【解决方案2】:

对我有用的正则表达式是:

/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

【讨论】:

    【解决方案3】:

    此正则表达式将匹配 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,'.');
    

    【讨论】:

      【解决方案4】:

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

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多