detectmobilebrowser.js的正则表达式中有魔力吗?

时间:2013-11-22 17:09:44

标签: javascript regex mobile user-agent

我已阅读Detect Mobile Browsers的代码。

我对此感到困惑,并希望有人能解释它是如何运作的:

(对不起,我发现只有一个最小化的版本,我添加了一些换行符以提高可读性,希望不会破坏代码。)

(function (a,b) {
     if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry
        |blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge
        |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?
        |phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.browser|link)
        |vodafone|wap|windows (ce|phone)| 

        ... and many more patterns ...

        |zeto|zte\-/i.test(a.substr(0,4)))
    window.location=b
})(
    navigator.userAgent || navigator.vendor || window.opera, // argument a
    'http://detectmobilebrowser.com/mobile'                  // argument b
);

我的问题是:

正则表达式针对navigator.userAgentnavigator.vendorwindow.opera(第一个真值)的前4个字符进行测试。

令我困惑的是:

  • 正则表达式的许多组件都长于4个字符。
  • 我见过的大多数用户都是Mozilla/5.0 (Linux; U; Android 4.1.1; ...,因此在很多情况下前4个字符都是'Mozi'。

它如何运作?

我在Chrome控制台中的简单测试:

/android|blackberry/i.test('Mozilla/5.0 (Linux; U; Android 4.1.1; ...'.substr(0,4))
// -> false
/android|blackberry/i.test('Mozilla/5.0 (Linux; U; Android 4.1.1; ...')
// -> true

1 个答案:

答案 0 :(得分:2)

你被缩小的代码误导了。它实际上是这样的:

if (/(android|bb\d+|meego).../i.test(a) ||
    /1207|6310|6590|3gso.../i.test(a.substr(0, 4))) {
    window.location = b
}