lxcnn

javascriptlover2 2010-01-19 10:00:51
Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12 其中,版本号是Firefox之后的数字。

b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";
实例化=>
"Firefox"&®Exp("(?:firefox)[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";

//不懂
...全文
266 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
bl_song 2010-01-20
  • 打赏
  • 举报
回复
TNND
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
这段代码我思考了两天,还是来问了解决问题,不过,比以前没有更多思考提问要收获多
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
escape 思考很深入!
b.version =vMark && RegExp("(?:" +vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";
vMark && 地方处理还是很成功的,据说这个是很好的处理了,来自有啊

先通过判断特有字符来判断浏览器类型:
var b = {
msie: /msie/.test(ua) && !/opera/.test(ua),
opera: /opera/.test(ua),
safari: /webkit/.test(ua) && !/chrome/.test(ua),
firefox: /firefox/.test(ua),
chrome: /chrome/.test(ua)
};


获取版本信息就比较麻烦,有啊Browser的方法就比较巧妙(有修改):
var vMark = "";
for (var i in b) {
if (b[i]) { vMark = "safari" == i ? "version" : i; break; }
}
b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1

http://www.cnblogs.com/cloudgamer/archive/2009/10/29/Cloudgamer_JavaScript_Library.html
-过客- 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 javascriptlover2 的回复:]
msie : / msie / .test(ua)&& ! / opera / .test(ua),  后面这个还真是没有必要!
[/Quote]

当然没必要,前面一个是后面一个的充分条件,前面一个匹配结果为true,后面一个必然为true,就是多余的
-过客- 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 javascriptlover2 的回复:]
      b.version =vMark && RegExp("(?:" +vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";

vMark  如果是null  空值的处理方式吧

escape  这里不需要把 

RegExp.$1  获得值吧

[/Quote]

"Firefox"&®Exp("(?:Firefox)[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";
用你给的这个实例化的你也看到了,正则表达式中用到了(?:Firefox),为了不取这个内容,还用了非捕捉组,然后后面又用RegExp.$1来取捕获组1匹配的内容,然后再用"Firefox" && 来拼接字符串,其实完全可以在一个正则中处理的,这样太绕了

escape在动态生成正则时使用,因为一时变量中出现了正则中的元字符,比如“abc(def”,就会导致正则编译出错,这个是会报错的,所以要用escape进行转义处理,这是出于对程序健壮性的考虑,非动态生成正则是不涉及到这个问题的
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
msie : / msie / .test(ua) && ! / opera / .test(ua), 后面这个还真是没有必要!

IE
而IE各个版本典型的userAgent如下:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
其中,版本号是MSIE之后的数字。

Firefox
Firefox几个版本的userAgent大致如下:
Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12 其中,版本号是Firefox之后的数字。

Opera
Opera典型的userAgent如下:
Opera/9.27 (Windows NT 5.2; U; zh-cn)
Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0
其中,版本号是靠近Opera的数字。

Safari
Safari典型的userAgent如下:
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3
其版本号是Version之后的数字。

Chrome
目前,Chrome的userAgent是:
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
其中,版本号在Chrome之后的数字。

Navigator
目前,Navigator的userAgent是:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6
其中,版本号在Navigator之后的数字。
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 lxcnn 的回复:]
引用 31 楼 javascriptlover2 的回复:
var reg = new RegExp("Expression", "img");
var reg = /Expression/img;

这个我到没有见过,我一般就一个
var reg = new RegExp("Expression" );
var reg = /Expression/;


img三种匹配模式而已

i 表示忽略大小写
m 表示多行模式
g 表示全局模式
[/Quote]

哎,如果是ig我还反映过来,哎
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";

vMark 如果是null 空值的处理方式吧

escape 这里不需要把

RegExp.$1 获得值吧
-过客- 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 javascriptlover2 的回复:]
var reg = new RegExp("Expression", "img");
var reg = /Expression/img; 

这个我到没有见过,我一般就一个
var reg = new RegExp("Expression" );
var reg = /Expression/; 
[/Quote]

img三种匹配模式而已

i 表示忽略大小写
m 表示多行模式
g 表示全局模式
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
var reg = new RegExp("Expression", "img");
var reg = /Expression/img;

这个我到没有见过,我一般就一个
var reg = new RegExp("Expression" );
var reg = /Expression/;
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
B = (function(ua)
{
var b =
{
msie : / msie / .test(ua) && ! / opera / .test(ua),
opera : / opera / .test(ua),
safari : / webkit / .test(ua) && ! / chrome / .test(ua),
firefox : / firefox / .test(ua),
chrome : / chrome / .test(ua)
}
;
var vMark = "";
for (var i in b)
{
if (b[i])
{
vMark = "safari" == i ? "version" : i;
break;

}
}
b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";

b.ie = b.msie;
b.ie6 = b.msie && parseInt(b.version) == 6;
b.ie7 = b.msie && parseInt(b.version) == 7;
b.ie8 = b.msie && parseInt(b.version) == 8;

return b;
}
)(window.navigator.userAgent.toLowerCase());
V68V6 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 lxcnn 的回复:]
楼主怎么还是姐妹军团时的作风啊,这个问题MS还没有讨论完呢
[/Quote]

有所进步了。。。

以前这100分是见者有份。。。现在只给作答者,也算没白费当初一番苦口婆心。。。
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
no ne 可不是lxcnn啊,表误会了
-过客- 2010-01-19
  • 打赏
  • 举报
回复
楼主怎么还是姐妹军团时的作风啊,这个问题MS还没有讨论完呢

这个正则真正的问题不在[\\/:]这里,而是在于以下几点

1、以下两种声明方式的区别和应用场景
var reg = new RegExp("Expression", "img");
var reg = /Expression/img;

2、为什么12楼标红的地方我说不可理喻

3、为什么要用escape

这些问题搞清楚了,这个问题才算有意义

PS:另一帖MS没什么意义,就不参与了

4、RegExp.$1指什么,哪里赋的值

javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 v68v6 的回复:]
原来是在做代理。。。

我不禁想起淘宝上的上线和下线。。。
[/Quote]
双线操作,没有代理啊,我最近在研究cloudgamer的库,遇到的问题,no ne =》sohighthesky大师咯
V68V6 2010-01-19
  • 打赏
  • 举报
回复
原来是在做代理。。。

我不禁想起淘宝上的上线和下线。。。
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
javascripter 22:27:39
[\\/:]匹配 /\: 吧

no ne 22:28:40
[\\/:]
\\表示 \是为了转义后面/的
javascripter 22:29:23
/ 需要转义吗?
no ne 22:29:29

javascripter 22:29:47
晕,知道了
-过客- 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 javascriptlover2 的回复:]
[\\/:]匹配 /\:  吧
[/Quote]

就是匹配字符“/”或者字符“:”,这里的“\\”是对“/”进行转义,其实在字符串形式声明正则时,“/”并不是元字符,所以这里的“\\”完全可以去掉
wiki14 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 v68v6 的回复:]
一个没注意,LZ竟然在某楼自己承认了。。。

我成了事后诸葛亮


[/Quote]

事前一样

呵呵~
javascriptlover2 2010-01-19
  • 打赏
  • 举报
回复
[\\/:]匹配 /\: 吧
加载更多回复(20)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧