2011-08-26 153 views
0

我自由地承认,我对正则表达式的理解是多余的。也就是说,我无法做到这一点的头或尾。这只发生在Chrome中。Chrome中的正则表达式奇怪

我有这段代码拉出来在一个HTML字符串body标签之间的文本:

var extractBodyHtml = function (obj) { 
    var regex = /<body.*?>([\s\S]*?)<\/body>/g; 
    //if (obj.match(regex)) { 
    if (regex.test(obj)) { 
     return RegExp.$1; 
    } else { 
     return obj; 
    } 
}; 

更新

在拨弄我不能重现此。事实上,完全相同的代码在一个地方工作,而不是相同的HTML,但不是另一个。免得你觉得我疯了,这里是调试器。

http://www.outsharked.com/chromedebug.png

注意注释行。这是第一个版本。有时它有效。在其他情况下,RegExp.$1只会返回单个字符“r”。这对于特定的情况总是可重现的。

请注意,obj.match(regex)始终返回正确的匹配(包括body标签),但访问反向引用会给“r”有时

当我将代码更改为regex.test(obj)时,情况始终正常,RegExp.$1返回内部内容。

我在做什么错?

+3

**为什么**你在做这个? 'document.body.innerHTML'有什么问题? – Matt

+0

因为它是一个字符串。它不是DOM的一部分。这是来自ajax查询的响应。 –

+0

你可以发布你的代码不工作在jsfiddle的例子吗? –

回答

1

您应该(几乎)从不使用正则表达式来解析html。

无论您从AJAX请求中获得什么响应,都可以将它传递给jQuery的构造函数(如果它是有效的html)。然后你可以用jQuery的常规方法解析它:

$.get('path/to/html', function(data){ 
    // "data" will hold your entire html returned 
    var theHTML = $(data).find('body').html(); // this'll have what you're looking for 
}); 
+0

其实这正是我这样做的原因。这并不总是奏效,因为jQuery通过将HTML添加到DOM来解析HTML,并且如果它已经包含在HTML中,它就会窒息。完整HTML文档的'$(data)'不会返回任何内容。 –

+0

@jamietre:你测试过了吗?这个对我有用。您的HTML可能有错误。尝试通过W3C验证器运行它:http://validator.w3.org/。而且,仅供参考,jQuery不会通过将HTML添加到DOM来解析HTML。它在内存中创建一个文档片段,并对其进行解析。 –

+0

http://jsfiddle.net/e4jaC/4/ –