Javascript正则表达式 - 为什么它在IE上没有按预期工作?

时间:2009-05-21 08:25:01

标签: javascript regex

在失去多少睡眠之后,我仍然无法理解这一点:

下面的代码(它是大型代码的简化,仅显示问题)标识FF上的Item1和Item2,但不在IE7上。我很傻。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>

<body>
<table><tr>
<td><img src=imgs/site/trash.jpg border=1></td><td><font style="">Item1</font></td>
<td><img src=imgs/site/trash.jpg border=1></td><td><font style="">Item2</font></td>
</tr></table>

<script type="text/javascript">
    var _pattern =/trash.*?<font.*?>(.*)<\/font>/gim;
    alert (_pattern);

    var thtml = document.documentElement.innerHTML;
    alert (thtml);
    while ( _match =_pattern.exec(thtml)){
        alert (_match[1]);

    }

</script>

</body>
</html>

注意:1。我知道有更好的方法可以获得Item1和Item2。这个例子用于以最简单的方式显示我面临的正则表达式问题。 2.当我删除表和/ table标签时,它可以工作。

提前致谢

4 个答案:

答案 0 :(得分:3)

说真的,这太可怕了。基于getElementById / getElementsByTagName的解决方案相当更可靠,更灵活。

至于实际问题,可能是因为 javascript多行正则表达式支持不是x浏览器安全,IE尤其有问题。删除表声明可能会强制IE在内部将剩余标记格式化为单行(=成功),然后将其添加回来将使IE添加回车等(=失败)。

我知道你确实说你知道有更好的方法,但是你没有解释为什么你坚持这个。依赖正则表达式并进一步依赖于IE的明文解释DOM会让你遇到这样的问题。不要这样做。

答案 1 :(得分:1)

问题是JScripts多行实现是错误的。它不允许任何字符。匹配换行符。

请改用此正则表达式: -

 var _pattern = /trash[\s\S]*?<font[^>]*>([^<]*)<\/font>/gi;

这消除了。总而言之,注意[\ s \ S]是等价的,但会匹配一个新行。

删除表更改内容的原因是IE的.innerHTML实现不依赖于收到的原始标记。而是通过检查DOM动态创建标记。当它看到一个表元素时,它会将输出中的换行符放在不同位置的输出中,而不是缺少表时。

答案 2 :(得分:0)

结尾的td标签有一个需要转义的字符:/ slash。我不知道这是不是IE7绊倒的原因。 Safari可以测试。

您可能需要考虑在表中添加ID。然后只迭代表的childNodes。你可以在更大的页面上浏览更少的HTML,也可以节省内存。

答案 3 :(得分:-1)

尝试使用new RegExp("", "gim")构建正则表达式。它更便携。