如何通过用户代理检测iOS 6及其所有次要版本?

7
如何通过用户代理检测iOS 6及其所有次要版本,使用简单的正则表达式或其他方法?最好能够区分iPhone和iPad。
这个问题不同于什么是iOS 6用户代理字符串?,因为我希望根据我已经知道的信息(可以在链接的问题中找到)来构建一个基于正则表达式的正则表达式。

你是在寻找任意的iOS 6用户代理,还是只是Safari? - BoltClock
理想情况下,应该考虑所有可能的用户代理,但由于Safari是最常见的,我认为它可能是一个起点 :) - dasheddot
2
只是想指出,用户代理很容易被欺骗。 - Arran
谢谢你的提示,但如果有人伪造他的用户代理,我不愿意为他提供我们酷炫的设备特定功能,所以对于我的目的来说这是可以接受的。 - dasheddot
2
这不是重复的问题,因为我想在已知信息的基础上构建一个正则表达式(这就是重复问题所问的)。 - dasheddot
显示剩余3条评论
1个回答

27

更新日志

2017年1月20日

  • UA字符串更新:141个匹配,0个部分匹配和797个无效行

  • 即使提到iPhone,“Mobile Safari 1.1.3(iPhone U; CPU like Mac OS X; en)”也被认为是无效的。实际上,在“iPhone”术语之后缺少了一个分号,这很可疑。

  • Safari 8+尚未出现在UserAgentString.com上

先决条件

  • 以下正则表达式是通用的。
  • 它将匹配在移动设备上运行的Safari用户代理字符串(SUAS) (请查看下面支持的设备列表)。
  • 该正则表达式基于 UserAgentString.com 所知的SUAS,截止至2017年1月20日

正则表达式

^(?:(?:(?:Mozilla/\d\.\d\s*\()+|Mobile\s*Safari\s*\d+(?:\.\d+)+\s*)(?:iPhone(?:\s+Simulator)?|iPad|iPod);\s*(?:U;\s*)?(?:[a-z]+(?:-[a-z]+)?;\s*)?CPU\s*(?:iPhone\s*)?(?:OS\s*\d+_\d+(?:_\d+)?\s*)?(?:like|comme)\s*Mac\s*O?S?\s*X(?:;\s*[a-z]+(?:-[a-z]+)?)?\)\s*)?(?:AppleWebKit/\d+(?:\.\d+(?:\.\d+)?|\s*\+)?\s*)?(?:\(KHTML,\s*(?:like|comme)\s*Gecko\s*\)\s*)?(?:(?:Version|CriOS)/\d+(?:\.\d+)+\s*)?(?:Mobile/\w+\s*)?(?:Safari/\d+(?:\.\d+)*.*)?$

支持的设备列表

  • iPhone
  • iPhone模拟器
  • iPad
  • iPod

解释/自定义

C开头的行可供自定义。

  1. ^(?:(?:(?:Mozilla/\d\.\d\s*\()+|Mobile\s*Safari\s*\d+(?:\.\d+)+\s*)
C 2.     (?:iPhone(?:\s+Simulator)?|iPad|iPod);\s*
  3.     (?:U;\s*)?
  4.     (?:[a-z]+(?:-[a-z]+)?;\s*)?
  5.     CPU\s*
  6.          (?:iPhone\s*)?
C 7.          (?:OS\s*\d+_\d+(?:_\d+)?\s*)?
C 8.          (?:like|comme)\s*Mac\s*O?S?\s*X
  9.      (?:;\s*[a-z]+(?:-[a-z]+)?)?
  10. \)\s*)?
  11. (?:AppleWebKit/\d+(?:\.\d+(?:\.\d+)?|\s*\+)?\s*)?
C 12. (?:\(KHTML,\s*(?:like|comme)\s*Gecko\s*\)\s*)?
C 13. (?:(?:Version|CriOS)/\d+(?:\.\d+)+\s*)?
  14. (?:Mobile/\w+\s*)?
  15. (?:Safari/\d+(?:\.\d+)*.*)?$

第1行. UA字符串可能会有所不同,因此引入此行以尽可能接受UA字符串。
第2行. 您可以在此处指定接受的设备的管道分隔列表。
(...)
第7行. 版本在这里指示。 如果要使用特殊版本,请更改此行。 不要忘记也更新第13行。例如,匹配iOS 5.x.y使用(?:OS\s*5_\d+_\d+\s*)?
第8行。 一些用户代理字符串被翻译。 单词like 可能会被翻译成外语。 正则表达式现在支持英语法语。 如果遇到其他语言,请调整此行。 不要忘记也更新第12行
(...)
第12行。 请参见第8行
第13行。 请参见第7行。例如,匹配 iOS 5.x.y使用(?:Version/5\.\d+\.\d+)?\s*)?


太棒了!!非常感谢您对我不太高质量的问题给出如此高质量的答案;)已点赞并标记为解决方案。谢谢! - dasheddot
@Stephan:没问题,实际上还有更多信息:https://dev59.com/ymnWa4cB1Zd3GeqP1YbF#12861494(请查看评论)。 - Alix Axel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接