这里讲的兼容性问题主要指String的API在正则表达式的处理上不同。

匹配结果的兼容性

第一个问题:在IE<=8中,如果split()方法的限定符是正则表达式,返回的数组不包含空值元素,而如果限定符用字符串表示则没有这样的问题:

",,ab,,".split(","); // output ["","","ab","",""]
",,ab,,".split(/,/); // output ["ab"]

第二个问题:正则表达式中可能有分组,但是这个分组可能并没有参与(也就是没有匹配到任何子字符串)。关于这个分组的结果:IE<=8返回的不是undefined,而Firefox2会返回空字符串,Safari3则直接什么也不返回(结果导致数组元素个数减少)。

"y".split(/(x)?y/); // ECMA :output ["",undefined,""]
"y".split(/(x)?y/); // IE8 :output []

如果是调用字符串的match方法,返回的结果也不同:

"y".match(/(x)?y/); // ECMA :output ["y",undefined]
"y".match(/(x)?y/); // IE8 :output ["y", ""]

因此,替换的时候,返回的结果也不同:

// ECMA :output "undefined"
// IE8: output ""
"y".replace(/(x)?y/,function($0,$1){return String($1);};

关于lastIndex的几个问题

0长度匹配时,lastIndex不变

先来看正常情况:如果执行带/g的RegExp的exec或test方法,它会从RegExp的lastIndex位置开始搜索。如果exec或test方法匹配到了,则更新RegExp的lastIndex索引为当前匹配的尾部。如果没有找到,则重置lastIndex为0,同时返回null。

不正常情况:如果匹配的是空字符,也就是匹配长度为0,那么lastIndex就永远是0。其结果就是导致下面这段代码在大部分浏览器中陷入死循环。

var regex = /^/gm,subject ="A\nB\nC",match,endPositions = []; while (match = regex.exec(subject)){endPositions.push(regex.lastIndex);
}// endPositions = [1,3,5] in IE <=8
// infinite loop in other browsers

为了避免死循环,IE<=8采用的方法是:即使匹配的长度为0,依然使lastIndex往后移。

解决死循环的方法一:

var regex= /^/gm,subject ="A\nB\nC",match,endPositions = []; while (match = regex.exec(subject)) {var zeroLengthMatch =!match[0].length;// Fix IE's incorrectlastIndexif (zeroLengthMatch&& regex.lastIndex > match.index)regex.lastIndex--;endPositions.push(regex.lastIndex);// Avoid an infiniteloop with zero-length matchesif (zeroLengthMatch)regex.lastIndex++;
}

解决死循环方法二:使用String.prototype.replace方法。

因为在replace方法中可以轻松获取匹配字符串的长度和位置,所以可以根据这两个数据算出lastIndex = indx + match.length。

执行replace方法,lastIndex可能会变

在IE<=8中,无论是非全局匹配替换还是全局匹配替换,lastIndex都会变,而且全局匹配替换之后,lastIndex也没有重置为0。而在Firefox,Chrome,IE>=9,Safari中,当replace方法执行全局匹配替换和非全局匹配替换时,lastIndex永远是0。

IE<=8,执行String.prototype.replace方法之后,RegExp对象的lastIndex没有重置为0。

var regexp = /l/;
var text = "hello";text.replace(regexp, function(match) {// output 3 in IE8console.log(regexp.lastIndex);return match;
});console.log(regexp.lastIndex); // output 3 in IE8

在Firefox,Chrome,IE>=9,Safari中,当replace方法执行全局匹配时,RegExp的lastIndex一直为0,而在IE<=8中lastIndex会变:

var regexp = /l/g;
var text = "hello";text.replace(regexp, function(match) {console.log(regexp.lastIndex);// output 0return match;
});console.log(regexp.lastIndex); // output 0 in FF,Chrome,IE>=9

关于[]和[^]

在IE<=8中,不允许出现[]或[^],这是因为IE<=8认为第一个右中括号(])属于原义字符而不是一个和左中括号相匹配的特殊字符,除非[]中含有其他字符。

因此以下正则表达式在IE<=8都会报错,错误信息为"Expected ']' in regular expression"。

var regexp = /[]/;
var regexp = /[^]/;
var regexp = /a[^]/;
var regexp = /a[]/;

RegExp在IE8等浏览器中的兼容性问题相关推荐

  1. php多浏览器支持,测试网站在多个浏览器中的兼容性:MultiBrowser ┆V1.3.1 多国语言版...

    MultiBrowser应该是做网站设计,网站设计师必备的软件了,此软件可以测试网站在多个浏览器中的兼容性!MultiBrowser能够让你同时检查同一网页在chrome.firefox.ie等浏览器 ...

  2. select在各个浏览器中的兼容性问题

    们知道select标签在各个浏览器中的属性和各浏览器的支持各有些不同,从而造成select选择框在各浏览器的显示有不同,下面我们通过对主要CSS属性的支持,打造全兼容select. 对select的h ...

  3. html引入vue不兼容ie11,Vue在IE11版本浏览器中的兼容性问题

    一:Vue 2.x cli1. 使用vue2.0的项目在IE11版本浏览器中是空白的  或者路由跳转但是而页面显示依旧是上一个路径的页面元素  这是因为ie11不支持es6  而我们之前有使用的bab ...

  4. html中padding在ie8兼容性,怎么解决bootstrap在各版本IE浏览器中的兼容性问题?

    元芳怎么了 Bootstrap的目标是在最新的桌面和移动浏览器上有最佳的表现,也就是说,在较老旧的浏览器上可能会导致某些组件表现出的样式有些不同,但是功能是完整的.bootstrap3支持的浏览器:C ...

  5. 360浏览器兼容问题html,该页面显示了360浏览器中的异常兼容性问题

    简介: 在Web应用程序的开发过程中,发现某些页面无法在360浏览器上正确显示,但是在其他浏览器上360浏览器页面显示不全,它们都处于正常状态. 有什么问题吗? 询问: 网页在360浏览器上显示不正确 ...

  6. JQuery中 JSON 兼容性问题(针对ie8)

    最近遇到了JSON.parse使用时一直报未定义,浏览器是ie 8 ,改成兼容模式就可以了,以下这篇文章详细解释了这点 出处:http://www.iefans.net/ie8-json-jiexi/ ...

  7. 关于ie8以上浏览器下—兼容性视图设置

    近期开发遇到一个问题,在ie11上页面排版显示的凌乱不堪,后来发现是在浏览器的 兼容性视图设置 这个应用中 添加了当前站点,去掉之后页面就显示正常了. 出于好奇,查询了一些关于这个功能的说明.原来 兼 ...

  8. 封装class,让className可以在IE8及其以下版本的浏览器中使用

    思路:在IE8及其以下版本的浏览器中className会变为一个字符串,用split将其变为数组,用逗号隔开 你所需要的class名,再建一个新数组,判断原来那个数组里面的元素有没有你需要的类名,如果 ...

  9. html中添加ie兼容性视图,IE11浏览器添加到兼容性视图中的网站无法保存怎么办?...

    IE11浏览器添加到兼容性视图中的网站无法保存怎么办?有用户在使用IE11浏览器时遇到了瓶颈,就是在兼容性列表中保存网站了,当重启浏览器之后,添加保存的网址和设置都没有了,为什么兼容性视图网站列表会无 ...

最新文章

  1. 云计算软件生态圈:摸到一把大牌
  2. API(Application Programming Interface,应用程序编程接口)
  3. centOs 7.2*64 ECS nginx安装教程
  4. emplace_back和push_back区别
  5. 复练-关于面试的科技树-V1004-求职面试的阶段和策略
  6. 如何修改wampserver中mysql中字符编码的解决方案
  7. 一步一步SharePoint 2007之四十一:实现Search(4)——设定爬网Schedule
  8. #includeiostream和#includeiostream.h的区别
  9. unity3d 台球源码_unity3D台球游戏源码
  10. 无线通信中的IQ调制,BPSK调制,QPSK调制,16QAM调制的理解
  11. 计算机网络找不到共享的打印机驱动程序,解决方案:连接共享打印机时如何解决“找不到驱动程序” _计算机硬件和网络_IT /计算机_...
  12. if 语句错误,提示Conditon is always ‘‘alse‘
  13. 在线裁剪图片 Jcrop
  14. JAVA集成微信支付 周期扣费
  15. ssb的matlab仿真,单边带调制(SSB调制)的理论基础和MATLAB仿真
  16. windows 查看电脑开关机时间
  17. 解析SRAM存储容量及基本特点
  18. 使用 css 创建 3D 效果的 书籍
  19. rimraf : 无法加载文件 C:\Users\Admin\AppData\Roaming\npm\rimraf.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅
  20. C. Two Shuffled Sequences

热门文章

  1. 阅读别人的代码,是一种怎样的体验
  2. Pixhawk开发手册
  3. 使用Ubuntu下usb抓包工具(usbmon)进行数据抓取的一次记录
  4. 微信小程序-批量删除
  5. shell清除历史记录
  6. 《Qt图形界面编程入门》课后习题全解
  7. 华为的鸿蒙系统是海思_华为鸿蒙,比海思还难【奇文共赏】
  8. 物联网发展的新趋势,你了解多少呢?
  9. 代理刷网页点击量-点到为止 2014-03-11 09:40
  10. 云e办前端项目--前端VUE路由之prototype