IE Javascript String.Match问题

时间:2010-04-13 15:57:37

标签: javascript regex internet-explorer

以下javascript代码连接正则表达式找到的匹配项。正则表达式应该找到任何单词或一组引用的单词。它似乎在FireFox和Chrome中完美运行,但它在IE中无法正常工作(我只在IE8上测试过它)。

var searchString = '';
var notString = 'dog cat "pirate ship"';
var matches = notString.match(/(\w+|"[^"]+")/ig);
for (i in matches) {
    searchString += " NOT " + matches[i];

}
alert(searchString );

正确的输出应该是:

  

不是狗不是猫不是“海盗船”

但在IE8中我得到了:

  

不是狗猫“海盗船”不是狗不   猫不是“海盗船”不是8不是21

有关如何使此浏览器兼容的任何建议。

非常感谢,

2 个答案:

答案 0 :(得分:5)

问题是您使用for...in语句。 for...in语句将迭代对象的所有可枚举属性,它们不适合迭代数组元素 - 在这种情况下,它迭代以下属性:

matches.input
matches.0
matches.1
matches.2
matches.index
matches.lastIndex

另见http://msdn.microsoft.com/en-us/library/7df7sf4x(VS.85).aspx

  

match方法返回的数组有三个属性,input,index和lastIndex。 input属性包含整个搜索的字符串。 index属性包含匹配的子字符串在完整搜索字符串中的位置。 lastIndex属性包含最后一个匹配中最后一个字符后面的位置。

改为使用适当的声明:

for (var i = 0; i < matches.length; i++)
    searchString += " NOT " + matches[i];

答案 1 :(得分:3)

当你这样做时会发生什么:

for (var i = 0; i < matches.length; ++i) { /* ... */ }

在数组实例上使用“for”形式的“for”循环是非常危险的。

编辑查看AndyE的答案,特别是关于“输入”属性的事情。