IE8不识别我的正则表达式

IE8 is not recognizing my regular expression

本文关键字:正则表达式 我的 识别 IE8      更新时间:2023-09-26

我正在尝试解析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的值是预期的。

帮忙吗?

谢谢!

您应该将字符串传递给regex的构造函数,使用regex字面语法,但不能同时使用。

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

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

更新:

正如您在答案中正确识别的那样,问题源于这样一个事实,即正则表达式搜索从前一个匹配中的最后一个字符的位置继续。纠正这个错误的一种方法是重置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"

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

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

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