【问题标题】:Get Android OS version from user-agent从用户代理获取 Android 操作系统版本
【发布时间】:2011-03-14 00:00:08
【问题描述】:

我一直在尝试找到一个解析器或正则表达式,它可以通过用户代理字符串为我提供 Android 操作系统版本。

例如

Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; Desire HD Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

将返回:

2.2.1

谁能帮忙?

【问题讨论】:

标签: android version user-agent


【解决方案1】:

这个正则表达式比mathepic's answer更“面向未来”:

Android (\d+(?:\.\d+)*);

它允许每个位置有多个数字以及版本号中的附加句点。 Android 已经推出 3 年了,我们正在使用 3.0。最终我们将到达 10.0.0。

这将捕获以下所有内容:

  • 1.6(真实)
  • 2.3.4(真实)
  • 9
  • 12.34.56(假的。但有一天...)
  • 3.4.5.6 和 4.5.6.7.8.9(假...但以防万一)

这可以写得更严格一点:

Android (\d+(?:\.\d+){0,2});

这更贴近我们已经看到使用的架构,但可能会错过某些版本,他们决定在版本末尾添加额外的 .1。它也匹配未来的10.0.0 版本。

【讨论】:

  • 小心:这也将匹配 "DefinitelyNotAndroid 0.0" ;-) 你可能想在前面附加一个 \b
  • 既然我们谈论的是面向未来:我会避免硬编码 ; 并将其替换为 [;)]\b。理论上的偏执版本可能使用Mozilla/5.0 (Linux; U; Android 2.2.1)
  • 很公平,+1 我想。它看起来更好一些,但我也认为它更难理解。无论如何,我可能应该在我的数字上使用 +。
  • 似乎 Android 9 跳过了 .0 >> Mozilla/5.0 (Linux; Android 9; SM-G960F Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/ 73.0.3683.90 移动 Safari/537.36 [FB_IAB/FB4A;FBAV/218.0.0.46.109;]
  • 不捕获 Android 10 它捕获 Android 10.x 但它在“Android 10”上失败
【解决方案2】:

我能否提供一个其他人可以轻松复制和粘贴的答案。

navigator.userAgent.match(/Android [\d+\.]{3,5}/)[0].replace('Android ','')

【讨论】:

    【解决方案3】:

    摩托罗拉的播放器用户代理可以有以下内容:

    Linux;Android ; Release/4.1.2
    

    所以,我不得不开始使用以下内容:

    [a|A]ndroid[^\d]*([\d[_|.]]+\d)
    

    【讨论】:

      【解决方案4】:

      正则表达式应该可以工作,就像未经测试的那样

      Android ([0-9]\.[0-9](\.[0-9])?);

      然后使用您使用的任何正则表达式函数将该部分放入括号中。

      【讨论】:

      • Android 1.5 将失败。
      • @Marcarse 你是对的,你必须为此做出调整。我不确定最后是否有保证至少 .0。修改应该可以解决这个问题。
      • 我建议您避免在正则表达式中进行不必要的捕获。这只是一个很好的做法,而且我在某些语言中被告知它提供了性能优势。
      【解决方案5】:

      如果您想将它与 User-Agent 一起使用,它可能是安全的,但您不应该使用它。

      Android ((\d+|\.)+[^,;]+)
      

      它会在它使用的 Android 之后捕获所有内容,

      1.6 2.4.4 10.12.5

      使用 Live Regex 进行测试:https://www.phpliveregex.com/p/uPw

      【讨论】:

        最近更新 更多