我正在通过httprequest加载一个js文件并尝试从结果文本中解析一个特定的字符串(在本例中是一个注释),但是我遇到了正则表达式的问题。
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字符串。我假设正确的方法是:
我不能简单地搜索文件中的评论,因为该文件可能包含多个函数,每个函数都有自己的注释。把这一切都放在上下文中,我这样做是因为我希望能够动态加载用于javascript单元测试的HTML。该函数最终将循环遍历单元测试对象中的所有函数,获取HTML,加载它,运行函数,删除HTML,然后转到下一个函数。
更新 感谢所接受的答案海报的所有帮助,我能够让一切正常。但是,我确实做了一些调整,例如添加对多行注释的支持以及事后替换所有垃圾字符,这样我就可以获得纯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;
}
}
}
答案 0 :(得分: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/
好的,根据你的评论,这是另一个镜头。这将在函数名后找到下一条注释。它将停止查看第一个}
,因此如果没有评论,它不应该进入下一个函数。
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;
}