2010-04-13 45 views
3

以下JavaScript代码连接了正则表达式找到的匹配项。正则表达式应该找到任何单词或一组引用的单词。它似乎在FireFox和Chrome中完美工作,但它在IE中不能正常工作(我只在IE8上测试过它)。IE Javascript String.Match问题

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

关于如何使这个跨浏览器兼容的任何建议。

非常感谢,

回答

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。输入属性包含整个搜索的字符串。 index属性包含完整搜索字符串中匹配子字符串的位置。 lastIndex属性包含最后一次匹配中最后一个字符后面的位置。

使用适当的语句来代替:

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

当你这样做会发生什么:

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

使用“中”的“为”形式排列情况下的循环是强大的风险。

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