我正在尝试解析一个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的值是预期的。
任何帮助?
谢谢!
答案 0 :(得分:5)
您应该将字符串传递给regexen的构造函数,或使用正则表达式文字语法,但不能同时使用两者。
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"
答案 1 :(得分:2)
显然,当你调用(RegExp对象).match(string)时,它会增加一个名为lastIndex的RegExp对象的属性。我并不完全熟悉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