Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式-为什么它不能在IE上正常工作?_Javascript_Regex - Fatal编程技术网

Javascript正则表达式-为什么它不能在IE上正常工作?

Javascript正则表达式-为什么它不能在IE上正常工作?,javascript,regex,Javascript,Regex,在失去了很多睡眠之后,我仍然无法理解这一点: 下面的代码(从只显示问题的较大代码简化而来)标识FF上的Item1和Item2,但不标识IE7上的Item1和Item2。我不懂 <!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/

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

下面的代码(从只显示问题的较大代码简化而来)标识FF上的Item1和Item2,但不标识IE7上的Item1和Item2。我不懂

<!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
项目2
var_pattern=/trash.*?(.*)/gim;
警报模式;
var thtml=document.documentElement.innerHTML;
警报(thtml);
while(_match=_pattern.exec(thtml)){
警报(_匹配[1]);
}
注:1。我知道有更好的方法获取项目1和项目2。这个例子以最简单的方式展示了我面临的正则表达式问题。 2.当我删除表和/表标记时,它会工作


提前谢谢,真的,这太可怕了。基于getElementById/getElementsByTagName的解决方案将更加可靠和灵活

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


我知道你说过你知道有更好的方法,但你没有解释为什么你坚持这样做。依赖正则表达式和进一步依赖IE对DOM的明文解释会让你陷入这样的问题。不要这样做。

试着用
新的regexp(“,“gim”)
构建你的regexp。更便于携带。

结尾的td标记有一个需要转义的字符:斜杠。我不知道这是否就是IE7被绊倒的原因。经过测试,Safari还可以


您可能想考虑将ID添加到表中。然后只遍历表的子节点。在一个更大的页面上使用更少的HTML可能也会节省内存。

问题在于JScript的多行实现存在缺陷。它不允许任何字符。匹配换行符

请改用此正则表达式:-

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

var\u pattern=/trash[\s\s]*?]*>([^谢谢!这是一个需要从随机页面获取各种数据的系统的一部分。它不能依赖于页面结构,而是依赖于作为数据一部分而不是页面结构的启发式和规则。在IE更改源代码之前,有没有办法获取javascript源代码?没有,没有。JS只知道已解释的DOM,没有意识到这一点源代码甚至是存在的。无论您声明的要求如何,我保证您最好还是尝试使用DOM方法遍历DOM。您可能希望研究使用类似于jQuery的东西启用xpath或css选择器解决方案的可能性。我不能使用jQuery或任何外部库。我想我应该使用DOM来找到小到可以用正则表达式单独解析的html部分。问题是我如何确定可以解析什么和不可以解析什么?是的,这将是一个大大改进的开始。寻找尽可能小的粒度,在可以缩小搜索范围的地方使用ID。之后,本质上是if/else和循环的问题。Invest花些时间查看DOM元素上的所有属性和方法。像nextSibling这样的东西可能会对您有所帮助。Nir这必须在客户端完成吗?还是可以在服务器端完成(例如,它是intranet页面)能够在桌子上放一个id意味着你有这样做的能力。在这种情况下,你最好用和放置class=“item”替换在适当的位置,然后枚举项目单元格的表行/单元格。如果可以控制标记,就不需要正则表达式。我同意,这就是为什么我建议在同一句话中迭代childNodes——换句话说,如果可能的话,使用DOM。在最初的帖子中,Nir没有指出是否存在y更改页面结构。但是你的正则表达式答案很有启发性。我今天学到了一些新的东西;谢谢。可能你的正则表达式与你想要的不匹配。更多信息:IE 6在没有特殊化的情况下在后面内部添加了一个标记。我有几个问题:1.为什么你对任何字符使用[^>]*而不是[\s\s]*(字体后)2.在[^>]*之后是否需要lasy?以及[^@Nir:我更喜欢避免懒惰的*?操作,因为它们会显著降低某些表达式的速度。使用*?将继续检查后续模式的其余部分,并且只有当以下模式失败时,它才会回滚到遇到*?时的位置,移动一个字符,然后重新进行操作。@Nir:使用[^>]*>可以使用模式,因为我们知道在找到第一个>字符时,我们已经完成了匹配字符串的该部分。这不会使用lazy?,因此效率更高。-1否。多行实现(如果有错误)与正则表达式完全无关。
m
标志仅影响
^$
。要使
匹配任何字符,
s
标志在其他语言中使用,但在JS中不可用。您的解决方案可以绕过该限制。