在失去多少睡眠之后,我仍然无法理解这一点:
下面的代码(它是大型代码的简化,仅显示问题)标识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标签时,它可以工作。
提前致谢
答案 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")
构建正则表达式。它更便携。