JavaScript正则表达式在不同浏览器中可能遇到的问题

这两天在用正则表达式搞一个稍微有点复杂的东西,但是不同浏览器之间的差异可浪费了我不少的人参。

现在我把正则表达式在五大主流浏览器(IE、firefox、Chrome、Safari、Opera,以当前版本为准)之间的差异整理一下罗列出来,给大家,也算给我自己做一个备忘。

Firefox和Chrome会过度优化在循环中创建的正则表达式,似乎它们在假设写JavaScript的人会把正则表达式的构建和赋值写错地方。

1 var r;

2 for(var i = 0; i < 2; i++){

3 var x = /abc/g;

4 if(r)

5 document.write(r == x); // 第二个循环时Firefox和Chrome会输出“true”

6 else

7 r = x;

8 }

如果你把一个有可能什么也不返回的函数作为第二个参数传递给replace方法,那么IE可能会直接删除匹配的文本(在之前的测试中我总结的是Opera的行为比较独特,现在看起来似乎是错误的结论),而其它浏览器则是会将匹配的文本替换成“undefined”。

1 document.write(‘123‘.replace(/2/, function(){})); // IE会输出“13”,而其它浏览器输出“1undefined3”

如果使用new RegExp的形式创建正则表达式时使用一个已有的正则表达式实例作为参数,那么大部分浏览器都会创建一个基本功能相同,但完全独立的、全新的正则表达式实例;而Safari则会很干脆地返回作为参数的那个正则表达式实例。

1 var r = /1/;

2 document.write(new RegExp(r) == r); // Safari会输出“true”,而其它浏览器输出为“false”

如果把一个“空”的正则表达式直接转化成字符串,IE以外的浏览器都会得到“/(?:)/”,而IE会得到“//”——但从正则表达式上直接提取source属性的时候,得到的都是空字符串。

1 document.write(new RegExp(‘‘)); // IE输出“//”,其它浏览器输出“/(?:)/”

2 document.write(eval(‘‘ + new RegExp(‘‘))) // IE输出“undefined”,其它浏览器输出“/(?:)/”

如果把一个包含斜线“/”的正则表达式直接转化成字符串——以“new RegExp(‘/‘)”为例,只有Firefox和Opera会得到“/\//”,并且直接提取source属性会得到“\/”;而其它浏览器则会得到“///”,且直接提取source属性会得到“/”。

1 document.write(new RegExp(‘/‘)); // Firefox和Opera输出“/\//”,其它浏览器输出“///”

2 document.write(eval(‘‘ + new RegExp(‘/‘))) // Firefox和Opera输出“/\//”,其它浏览器输出“undefined”

如果在使用字面表达式来定义一个正则表达式时,使用了无效的选项标志(例如“/abc/n”),则Chrome和Safari会完全忽视此无效选项标志(等同于“/abc/”),而在其它浏览器会导致语法错误。

1 document.write(/abc/n); // Chrome和Safari会输出“/abc/”,其它浏览器中产生语法错误

暂时就这些吧,发现新的再补上。

(转自:http://www.cr173.com/html/6822_1.html)

时间: 2024-10-26 13:51:24

JavaScript正则表达式在不同浏览器中可能遇到的问题的相关文章

JavaScript正则表达式的浏览器的差异

JavaScript中的正则表达式在不同的浏览器中得到的结果可能会有差异,下面把正则表达式在五大主流浏览器(IE.Firefox.Chrome.Safari.Opera,以当前版本为准)之间的差异整理一下罗列出来.兰西县璩家摄影 1. Firefox和Chrome会过度优化在循环(以及其中内嵌的函数定义)中创建的正则表达式,似乎它们在假设写JavaScript的人会把正则表达式的构建和赋值写错地方. var r; for(var i = 0; i < 2; i++){ var x = /abc/

JavaScript权威指南第13章 web浏览器中的javascript

13.1 客户端javascript window对象是所有的客户端javascript特性和api的主要接入点.表示浏览器的一个窗口,可以通过window对象来引用它. window 的方法 alert() prompt() confirm() 13.2 在html里嵌入javascript 4种方法: 内联:放置在<script></script>标签之中 外部引入:<script src="   "></script> html程序

Javascript限制网页只能在微信内置浏览器中访问

转载:http://segmentfault.com/a/1190000000754332 最近正在开发一个微信公众账号,其中有一项功能是用户发送文字消息给公众号,然后公众号返回图文消息给用户,用户再点击图文消息即可跳转到一个网页链接,在微信的内置浏览器中打开.那么问题就来了,这个网页首先涉及到了移动web前端开发,我优先选择了用HTML5+bootstrap组合来实现页面的美观效果,前端其他的任务交给javascript解决(这里我是完全使用原生javascript代码,没有用到任何的框架,因

浏览器中Javascript单线程分析

线程这个特性对于一门语言环境来说是尤其重要的,在Java/C++环境下都提供了多线程API操作. 但在Javascript中据说代码执行时单线程的,大量计算的逻辑会阻塞浏览器HTML渲染,但setTimeout延时处理.XHR的异步请求是如何实现的, 接下来我们将逐一分析. 首先需要肯定的是浏览器中Javascript确实是单线程执行的,不信我们可以看个例子. <html> <head></head> <body> <script>setTime

第十一章:WEB浏览器中的javascript

客户端javascript涵盖在本系列的第二部分第10章,主要讲解javascript是如何在web浏览器中实现的,这些章节介绍了大量的脚本宿主对象,这些对象可以表示浏览器窗口.文档树的内容.这些章节同样涵盖重要的web应用所需要的网络编程API.本地存储和检索数据.画图等.主要包含内容有以下章节: web浏览器中的javascript / window对象 /  脚本化文档 /  脚本化css / 事件处理 / 校本化http / jQuery类库 / 客户端存储  /  多媒体和图形编程 /

JavaScript------&gt;调试JavaScript代码------&gt;使用 浏览器 中的 “开发者工具” 来调试

1.如何打开浏览器中的"开发者工具" *360安全浏览器 *方法一,打开想要调试的网页如index.html,浏览器右上角---工具----开发人员工具 *方法二,直接按快捷键F12即可打开浏览器中的开发者工具 2.使用浏览器中的"开发者工具" 2.1使用开发人员工具中的console面板 console面板概述: 该面板内可以输入JavaScript代码 按回车后,直接执行JavaScript代码 1)console.log(<变量>);//回车后显示

[JavaScript] js判断是否在微信浏览器中打开

用JS来判断了,经过查找资料终于实现了效果, function is_weixn(){     var ua = navigator.userAgent.toLowerCase();     if(ua.match(/MicroMessenger/i)=="micromessenger") {         return true;     } else {         return false;     } } 通过测试完全通过,无论是android 还是iphone,ipad

浏览器中的XML与JavaScript

浏览器中的XML与JavaScript 在处理XML前,你需要在JavaScript中获取它.这一部分展示了一些不同的方法用来在JavaScript中获取XML并且对它进行处理. XML的节点类型 在我们研究如何处理XML前,先来了解下XML中不同的节点及类型.如果是HTML,了解这些节点就没必要了,但由于XML的可扩展性和结构的不确定性,了解这些固有节点类型就显得犹为重要了. 下面是XML 中12种不同的节点(表格取自W3School中文站点): 节点类型 描述 Document 表示整个文档

Web浏览器中的JavaScript(二)

客户端Javascript时间线: 1)  Web浏览器创建Document对象,并开始解析Web页面,解析html元素和它们的文本内容后添加Element对象和Text节点到文档中.在这个阶段documen.readystate属性值是"loading" 2)  当HTML解析器遇到没有async和defer属性的<script>元素时,它把这些元素添加到文档中,然后执行行内或外部脚本.这些脚本会同步执行,并且在脚本下载(如果需要)和执行时解析器会暂停.这样脚本就可以用d