我正在通过 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 字符串。我假设正确的方法是:
- 通过 httprequest 获取 Javascript 文件 - 已经完成
- 在 SampleTest 中找到与传递给 getHTML 的名称匹配的函数,并通过正则表达式将整个函数作为字符串返回。
- 使用另一个正则表达式从以 /* :DOM 开始并以 */ 结尾的函数字符串中提取字符串。即使为简单起见,我只使用单行,这应该可以是多行注释。
- 最后,用 html 字符串替换所有的垃圾,例如 * 和 :DOM。
我不能简单地在文件中搜索评论,因为该文件可能包含多个函数,每个函数都有自己的评论。为了将这一切放在上下文中,我这样做是因为我希望能够动态加载 HTML 以进行 javascript 单元测试。该函数最终将遍历单元测试对象中的所有函数,获取 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;
}
}
}