2011-08-26 57 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/ –