以下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
有关如何使此浏览器兼容的任何建议。
非常感谢,
答案 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的答案,特别是关于“输入”属性的事情。