2012-04-06 61 views
3

我通過的HttpRequest加載一個js文件,並從得到的文本嘗試分析一個特定的字符串(在這種情況下的註釋),但我有正則表達式的麻煩。使用JavaScript正則表達式來提取評論從在一個函數

function SampleTest() { 
    this.test1 = function() { 
     /* :DOM <div id="sampleDIV">You loaded the sample div</div> */ 
    }; 
    this.test2 = function() { 
     /* :DOM <div>Second Div Loaded</div> */   
    } 
} 

在另一個劇本,我有以下功能:

var getElementFromComment = function(obj) { 

    function getHTML(method) { 
     var httpRequest = new XMLHttpRequest(); 
     httpRequest.open('GET', 'SampleTest.js', false); 
     httpRequest.send(); 
     var response = httpRequest.responseText; 

     var re = new RegExp(method); //Not sure how to implement the regex 
     var result = response.match(re); 
     console.log(result); 
    } 

    for(var method in obj) { 
     getHTML(method); 
    } 
} 

var sampleTest = new SampleTest(); 
getElementFromComment(sampleTest); 

最終結果應該基於所傳入的函數名SampleTest這一評論被提取HTML在我的情況我。將遍歷所有函數併爲每個函數檢索另一個html字符串。我假設正確的方法是:

  1. 獲得通過的HttpRequest JavaScript文件 - 已經完成
  2. 查找傳遞 到getHTML名稱匹配內SampleTest功能和返回整個功能通過串正則表達式。
  3. 使用另一個正則表達式從 函數的字符串中開始/ *提取字符串:DOM和以* /結束這應該可以成爲儘管爲了簡單起見,我只用一條線一個多行註釋。
  4. 最後,更換所有的垃圾,如*的和:DOM其中 應該離開我的HTML字符串。

我不能簡單地在文件中搜索關於蝙蝠的註釋,因爲該文件可能包含多個函數,每個函數都會有自己的註釋。爲了把這一切都放在上下文中,我這樣做是因爲我希望能夠在運行中爲JavaScript單元測試加載HTML。該功能最終會遍歷單元測試對象的所有功能,得到了HTML,加載,運行功能,刪除HTML,並移動到下一個功能。

UPDATE 由於從接受的答案海報各方面的幫助,我能得到的一切工作。然而,我卻不得不做出一些調整,比如增加了對多行註釋的支持,以及在事後更換所有的垃圾字符,所以我可以得到一個純HTML字符串。我的更新代碼如下。

function getHTML(method, str) { 
     var commentMatch; 
     var re = new RegExp(method+'\\s*=\\s*function[^}]+\\*/'); //Not sure how to implement the regex 
     var fnMatch = str.match(re); 
     if(fnMatch) { 
      var fnEx = new RegExp('\/\*\s*:[^\s]+\s*(.*?|\n)\*\/', 'g'); 
      commentMatch = fnMatch[0].match(fnEx); 
      var result = commentMatch[0].replace(/(\s*:DOM\s*)|(\*\/)|(\/\*)|(\*)/gm, ''); 
      result = result.replace(/^\s*/gm, ''); 
      if(commentMatch) { 
       return result; 
      } 
     } 
    } 
+1

你是否意識到你的ajax調用是異步的,你不能期望在'.send()'之後結果可用?你需要一個'onreadystatechange'處理程序來知道ajax調用何時實際完成並且數據可用。所以,我認爲你首先需要修復步驟1. – jfriend00 2012-04-06 16:40:28

+0

謝謝,我只是測試很快,結果正在返回,所以我還沒有到處添加onreadystatechange。懶惰,我知道。 – ryandlf 2012-04-06 16:58:41

+1

如果您爲此使用JSON,將會更容易,而不是嘗試從源代碼中提取信息作爲字符串。 – 2012-04-06 17:02:01

回答

1

如果你正在嘗試做的是提取在JavaScript字符串變量一段JavaScript代碼的註釋字符串,可以是這樣做的:這裏

var str = "function SampleTest() { \ 
    this.test = function() { \ 
     /* :DOM <div id=\"sampleDIV\">You loaded the sample div</div> */ \ 
    }; \ 
}"; 

var matches = str.match(/\/\*\s*:DOM\s*(.*?)\*\//); 
if (matches) { 
    alert(matches[1]); 
}​ 

工作演示:http://jsfiddle.net/jfriend00/hWCwA/


如果「:DOM」部分並不總是相同的,那麼你可以使用一個稍微不同的版本是這樣的:

var str = "function SampleTest() { \ 
    this.test = function() { \ 
     /* :DOM <div id=\"sampleDIV\">You loaded the sample div</div> */ \ 
    }; \ 
}"; 

var matches = str.match(/\/\*\s*:[^\s]+\s*(.*?)\*\//); 
if (matches) { 
    alert(matches[1]); 
}​ 

這裏工作演示:http://jsfiddle.net/jfriend00/qpF3k/


OK,根據您的意見,這裏的另一個拍攝它。這將在函數名稱後面找到下一個註釋。它將停止在看第一}所以它不應該進入下一個功能,如果這一塊有沒有意見。

function findComment(funcName, str) { 
    var commentMatch; 
    var re = new RegExp("this\\." + funcName + "\\s*=\\s*function[^}]+\\*/"); 
    var funcMatch = str.match(re); 
    if (funcMatch) { 
     commentMatch = funcMatch[0].match(/\/\*\s*:[^\s]+\s*(.*?)\*\//); 
     if (commentMatch) { 
      return(commentMatch[1]); 
     } 
    } 
    return null; 
} 
+0

這與回答我的問題非常接近。我將如何開始在函數名處獲取字符串,並在註釋行結尾處結束,而不管註釋的行數是多少? – ryandlf 2012-04-07 06:26:39

+0

@ryandlf - 但在你的問題點#3要求評論,所以這就是我寫了一個算法來提取。如果你想要別的東西,你必須更好地解釋你想要的東西。你想要什麼返回?請準確地說出你想從這個例子返回的文本。 – jfriend00 2012-04-07 06:37:26

+0

對不起,我重讀了一遍,有點不清楚。我通過http檢索「字符串」,因此sampletest的整個源代碼在js代碼中以字符串形式提供。第一個是找到函數名,然後返回該函數後面出現的註釋(多行)。原因是因爲在生產中,該類中會有許多不同的功能,每個功能都有或沒有評論部分,我需要解析HTML。那有意義嗎? – ryandlf 2012-04-07 06:45:46