我得到一些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是不好的,但它不是我的代码,我只需要修复它。
答案 0 :(得分:9)
它表现不同的原因是因为使用了括号的子表达式捕获。其他浏览器将这些捕获内的匹配添加到生成的数组中,IE 8和更低版本没有。要获得更一致的结果,您必须使该组无法捕获:
/(?:<body>|<\/body>)/ig
这就是其他浏览器在[2]
而非[1]
- [1]
内容的内容理论上包含字符串"<body>"
的原因。其他浏览器在这个浏览器上是正确的,Internet Explorer 9通过实现ECMAScript第5版规范所概述的方法来解决问题。
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];
}