Ruby正则表达式:区分iOS Safari& iOS Chrome

时间:2012-07-17 18:02:22

标签: ruby-on-rails ruby regex user-agent

根据以下文档:https://developers.google.com/chrome/mobile/docs/user-agent

以下是适用于iOS UA字符串的Chrome:

Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3

这是适用于iOS UA字符串的Safari:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3

尽管我可以说出未来的不同,但Chrome会包含“CriOS”。我希望能够区分这两个浏览器,并因此设置使用正则表达式。

使用:

/Gecko\) (?!CriOS)/

我能够做到这一点,但我是偏执狂,因为我不在表达式中包含iPhone(也许这也会在Android上触发等)

我想编写以下正则表达式,在以下情况下返回匹配:

  1. 该字符串包含“iPhone”
  2. 该字符串不包含“CriOS”
  3. 我该怎么做呢?

    仅供参考我一直在使用rubular来测试reg exp,这真是太棒了http://rubular.com/

2 个答案:

答案 0 :(得分:7)

这应该这样做:

iPhone(?!.*?CriOS)

iPhone匹配该单词的任何出现。然后它使用iPhone匹配中的否定前瞻。 .*?CriOS匹配任何/所有字符,直到找到CriOS(?!expr)是一个负面的预测。如果表达式为false,那么它之前的内容(Iphone)将匹配,否则不会。

答案 1 :(得分:1)

有关iPhone Safari字符串的更多详细信息,请尝试:

'Mozilla/(\d+(?:\.?\d+)*) \(([\w\s\;]+?)\) AppleWebKit/(\d+(?:.?\d+)*) \([\w\s\,]*\) Version/(\d+(?:.?\d+)*) Safari/(\d+(?:.?\d+)*)'

现在你可以明显地适应Chrome以及......