gpt4 book ai didi

javascript - 使用 Javascript 正则表达式从函数中提取注释

转载 作者:行者123 更新时间:2023-11-29 15:47:12 25 4
gpt4 key购买 nike

我正在通过 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 字符串。我假设正确的方法是:

  1. 通过 httprequest 获取 Javascript 文件 - 已经完成
  2. 在 SampleTest 中找到与传递的名称相匹配的函数进入 getHTML 并通过正则表达式将整个函数作为字符串返回。
  3. 使用另一个正则表达式从以/* :DOM 开头并以 */结尾的函数字符串 这应该可以是多行注释,即使为简单起见我只使用了一行。
  4. 最后,替换所有垃圾,例如 * 和 :DOM应该给我留下一个 html 字符串。

我不能直接搜索文件以查找注释,因为该文件可能包含多个函数,每个函数都有自己的注释。为了将这一切放在上下文中,我这样做是因为我希望能够动态加载 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;
}
}
}

最佳答案

如果您要做的是从 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;
}

关于javascript - 使用 Javascript 正则表达式从函数中提取注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10046385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com