IE中不同的分裂正则表达式结果

时间:2011-04-04 09:10:29

标签: javascript regex

我得到一些HTML作为ajax响应,我需要得到正文内容。所以我做了这个正则表达式:

/(<body>|<\/body>)/ig

在所有浏览器中运行良好但由于某种原因,当我使用split时,IE给了我另一个数组:

data.split(/(<body>|<\/body>)/ig)

在所有普通浏览器中,正文的内容为split(/(<body>|<\/body>)/ig)[2],但在split(/(<body>|<\/body>)/ig)[1]中。 (在IE7和8中测试)

这是为什么?我怎么能修改它,以便在所有浏览器中获得相同的数组?

修改 只是为了澄清。我alrady有tobyodavies提到的解决方案。我想理解,为什么它的行为不同。

这是响应中的HTML :(数据中的字符串)

<!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"  xml:lang="de"  lang="de" dir="ltr">
<head>
blablabla...
</head>
<body>
<div class="iframe">
   <div id="block-menu-menu-primary-links-user" class="block-menu">
 <h3>Primary Links - User</h3>  <div class="content"><ul class="menu"><li class="leaf first"><a target="content" href="#someurl" title="">Login</a></li>
<li class="leaf last"><a target="content" href="#someurl" title="">Register</a></li>
</ul></div>
</div>
</div>
</body>
</html>
PS:我知道用正则表达式解析HTML是不好的,但它不是我的代码,我只需要修复它。

4 个答案:

答案 0 :(得分:9)

它表现不同的原因是因为使用了括号的子表达式捕获。其他浏览器将这些捕获内的匹配添加到生成的数组中,IE 8和更低版本没有。要获得更一致的结果,您必须使该组无法捕获:

/(?:<body>|<\/body>)/ig

这就是其他浏览器在[2]而非[1] - [1]内容的内容理论上包含字符串"<body>"的原因。其他浏览器在这个浏览器上是正确的,Internet Explorer 9通过实现ECMAScript第5版规范所概述的方法来解决问题。

但是,有更多的不一致之处。所有浏览器中的ECMAScript 5合规性都将解决这些差异,但您可能需要查看Steven Levithan's blog,其中概述了不同的实现,甚至提供了自定义split()方法作为问题的解决方案。

答案 1 :(得分:2)

您是否考虑过使用xhr.responseXML.body.innerHTML DOM在解析HTML方面要比正则表达式好多了

答案 2 :(得分:1)

以下页面列出了浏览器之间“拆分”实施的差异:http://blog.stevenlevithan.com/archives/cross-browser-split

答案 3 :(得分:0)

您可以这样做:


var body_content;
var isIE = ( (ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1) );
var results = data.split(/(<body>|<\/body>)/ig);

if (isIE) {
  body_content = results[1];
} else {
  body_content = results[2];
}