2

我正在尝试解析 AJAX 响应并获取 body 标签的 id。不过,我不能通过 jQuery 来做到这一点,因为 jQuery 不能为 body 标签模拟 DOM 响应。

我已将其拆分为多行以尝试隔离错误。这在现代浏览器中有效,但在 IE8 中失败。

var bodyIDregex = new RegExp(/<body[^>]*id=["'](.*?)["']>/gi),
matched = html.match(bodyIDregex),
bodyID = bodyIDregex.exec(matched[0]);
bodyID = bodyID[1];

我已经确认变量 html 的值符合预期。

有什么帮助吗?

谢谢!

4

2 回答 2

6

您应该将字符串传递给正则表达式的构造函数,或者使用正则表达式文字语法,但不能同时使用两者。

var bodyIDregex = /<body[^>]*id=["'](.*?)["']>/gi

或者

var bodyIDregex = new RegExp("<body[^>]*id=[\"'](.*?)[\"']>","gi")

更新:

正如您在答案中正确确定的那样,问题源于正则表达式搜索从上一个匹配中最后一个字符的位置继续进行。纠正此问题的一种方法是 reset lastIndex,但在这种情况下,这不是必需的,因为您只需要与字符串匹配一次:

var bodyIDregex = /<body[^>]*id=["'](.*?)["']>/gi,
    bodyID = bodyIDregex.exec(html);

//bodyID is now the array, ["<body id="test">asdf</body>", "test"]

alert(bodyID[1]);
//alerts the captured group, "test"
于 2013-05-23T18:15:56.820 回答
2

显然,当您调用 (RegExp object).match(string) 时,它会增加 RegExp 对象的一个​​名为 lastIndex 的属性。我并不完全熟悉 RegExp 对象的工作原理,但这会在稍后尝试调用 exec() 方法时引起问题。

显然,解决方案是将 lastIndex 重置为零。

var html = '<html><body id="test">asdf</body></html>';

var bodyIDregex = /<body[^>]*id=["'](.*?)["']>/gi,
matched = html.match(bodyIDregex);
// Reset lastIndex
bodyIDregex.lastIndex = 0;
var bodyID = bodyIDregex.exec(matched[0]);
alert(bodyID.length);
bodyID = bodyID[1];

document.write(bodyID); // writes test
于 2013-05-23T18:50:20.060 回答