detectmobilebrowser.js的正则表达式有魔力吗
Is there magic in the regular expression of detectmobilebrowser.js?
我已经阅读了Detect Mobile Browser的代码。
我对此感到困惑,希望有人能解释一下它是如何工作的:
(对不起,我只找到了一个最小化的版本,为了更好的可读性,我添加了一些换行符,希望不会破坏代码。)
(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.userAgent
或navigator.vendor
或window.opera
的前4个字符(第一个真值)测试正则表达式。
让我困惑的是:
- 正则表达式的许多组件的长度远远超过4个字符
- 我见过的大多数userAgent都像
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
您被缩小的代码误导了。它实际上是这样的:
if (/(android|bb'd+|meego).../i.test(a) ||
/1207|6310|6590|3gso.../i.test(a.substr(0, 4))) {
window.location = b
}
相关文章:
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 这个正则表达式的日期/时间有什么问题
- 较短的正则表达式,按2个条件拆分,外部有空格
- 正则表达式上的重音符号有什么用
- 我的电子邮件正则表达式有什么问题
- JavaScript:是否有完全支持查找的正则表达式库
- url的正则表达式有问题
- detectmobilebrowser.js的正则表达式有魔力吗
- 如何创建一个正则表达式来拆分行,除非有斜杠
- 正则表达式,用于检查输入是否有字符或至少有1个笑脸
- 正则表达式在换行符 前面有两个空格
- 这个正则表达式有什么问题
- 正则表达式以匹配单词,除非它们前面有字符
- JS 正则表达式以匹配字符串,令牌之间最多有 1 个空格
- 是否需要检查正则表达式匹配长度以确定是否至少有一个匹配项
- 是否有可能/建议解析我的用户输入字符串 w 正则表达式
- 确定 JavaScript 正则表达式中有多少个捕获组
- 正则表达式删除 - 除非前面有其他运算符
- 正则表达式允许一个单词后有空格
- Javascript 正则表达式有例外