Javascript评论剥离器[关闭]
Posted
技术标签:
【中文标题】Javascript评论剥离器[关闭]【英文标题】:Javascript comment stripper [closed] 【发布时间】:2011-04-04 09:57:00 【问题描述】:我正在寻找一些工具来从 javascript 源中删除 cooments。我可以用谷歌搜索一些,但没有一个满足以下要求:其他所有内容都应保持原样,特别是不删除空格,但如果评论占用一整行,则该行也将被删除。
简而言之,我希望能够从带有 cmets 的格式良好的源转到不带 cmets 的格式相同的源。仅包含 cmets 的行将被删除,并且尾随 cmets 与尾随空格一起被删除。其余的都保持原样。
你知道有什么工具可以做这样的工作吗?
编辑:我尽量说得更具体一些。不能使用正则表达式,因为字符//
或/*
也可以出现在字符串、正则表达式等中。
工具应该接受这个输入
var a = true;
//the following code is every useful
var b = 2;//really, really useful
/**
Never, ever do this
var c = 3;
*/
var d = 4;
并给出这个输出
var a = true;
var b = 2;
var d = 4;
【问题讨论】:
只是出于好奇:你为什么要这样做?如果您要更改源,为什么不完全压缩? 这是给我的。有时我发现没有我留下的所有 cmets 的源代码更具可读性,尤其是那些用于自动生成文档的源代码。 如果你使用 Gulp,npmjs.com/package/gulp-strip-comments 应该很有用 【参考方案1】:这是我编写的一些代码: 看看吧:here
另外,here 是我的代码示例,您可以立即在网页中进行测试
这是我没有写的一个可能很方便,尽管他的代码在某些正则表达式文字上会失败:http://james.padolsey.com/javascript/removing-comments-in-javascript/
编辑: 我写的代码是这样的。我不会更新它,因为它是我十几岁时写的东西,而且对编程很陌生。如果有错误,您可以修复它。
【讨论】:
它留下了很多空白而不是 cmets,就像我尝试过的其他工具一样。我想让它完全删除由 cmets 组成的行。 修改代码做你想做的应该不难... 它变得更加混乱,因为原始代码是按字符解析的,并且要执行我想要的操作,还需要跟踪行。但我还是决定接受这一点,并进行必要的修改。 @Andrea:更新了代码以删除文件中的最后一行,如果该行仅包含 cmets。 @MIrrorMirror:我的代码没有调用alert或者创建弹窗...看源码。【参考方案2】:将 Google 的 Closure Compiler 与 WHITE_SPACE_ONLY 和 PRETTY_PRINT 一起使用——它唯一能做的就是删除 cmets(当然,除非您不以 PRETTY_PRINT 的方式格式化您的代码。)
原来是这样的:
// This function alerts a name
function hello(name)
/**
* One lone
* multi-line
* comment
*/
alert('Hello, ' + name);
hello('New user');
进入这个:
function hello(name)
alert("Hello, " + name)
hello("New user");
【讨论】:
这几乎是我想要的,但不完全是。它删除所有新行,无论原始代码中是否存在某些行。我只想删除完全由 cmets 组成的行,而不是有意的新行。 它也会与其他东西混淆,例如它用两个空格替换我的标签。我需要一个不会妨碍我的工具,它只应该删除 cmets。 太棒了,非常感谢 @Andrea,根据您的编辑器,您可以使用 JS 格式插件或像 beautifier.io这样的 JS 格式网站重新格式化您的代码【参考方案3】:在这里找到了一个非常好的解决方案:http://blog.ostermiller.org/find-comment
摘录:
现在我们只需要修改注释结尾允许任意数量的*:
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
我们现在有了一个正则表达式,我们可以将它粘贴到支持正则表达式的文本编辑器中。找到我们的 cmets 只需按下查找按钮。您可能可以为您的特定编辑器稍微简化此表达式。例如,在某些正则表达式实现中,[^] 假定 [\r\n] 并且所有 [\r\n] 都可以从表达式中删除。
这很容易扩充,因此它也可以找到 // 样式 cmets:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
但是,请务必阅读注意事项,因为这会从 cmets 中删除 cmets,或者可能会不正确地取消注释代码。但是,对我来说效果很好:-)
【讨论】:
【参考方案4】:库decomment 完全符合您的描述:
其他所有内容都应保持原样,特别是不删除空格,但如果注释占用一整行,则该行也将被删除。
它还支持 JSON5、JavaScript ES6、CSS 和 html。
【讨论】:
它在windows下效果不佳: ;(function() // *** LOGGER CODE *** // @Vladimir 能否请您澄清或记录问题?【参考方案5】:天真的一个内胆剥离器:
var noComments = text.replace(/\/\*(.|[\r\n])*?\*\//g, '').replace(/\/\/.*/gm, '');
免责声明:
“天真”的意思是:
它无处不在,说如果你有:
var a = "/*";
someImportantLogicHere();
var b = "*/";
你会得到
var a = "";
应用这些正则表达式的顺序很重要,以不同的顺序应用它会得到不同的结果
但对于 95% 的其他情况,它是简单实用的
【讨论】:
【参考方案6】:您可以使用 babel "comments": false
来实现这一点。我已经为the-super-tiny-compiler
写了一个demo,请查看https://github.com/gengjiawen/the-super-tiny-compiler。
安装deps后运行npm run remove-comments
。
【讨论】:
【参考方案7】:只是一个小见解,可能会帮助您使复杂的正则表达式变得更简单..
以后可以随意应用上述答案中的任何提示..
var text = ".................."; //assuming staring point
........
text = text
.replace(/\r/g,"##R##")
.replace(/\n/g,"##N##")
.replace(/\/\*(.*)\*\//g,"")
.replace(/##R##/g,"\r")
.replace(/##N##/g,"\n")
应用一点(独立)替换 \r
和 \n
将简化您的正则表达式很多!,
最初即使使用
g
和m
修饰符(全局和“贪婪”标志),您仍然无法成功删除 cmets(除非您自定义构建“角色步行者”循环,或运行相同的reg-ex 多次...)这是由于自 ECMAScript 4 以来正则表达式匹配的一些特征(ECMA-262)
这里有什么值得一提的聪明事?
通过这种方式,我们应用了离散数学(语言和语法)中称为“语法之外的替换”的漂亮小技巧,我非常规地使用它来“保护”\r
和 \n
中的区域文本没有实际应用太多计算能力来处理它们(如剪切/组装等)
这是一场赌博,因为从本质上讲,##R##
和 ##N##
(虽然不那么常见)可能是一个现有的短语,但这不是问题,因为替换可能非常复杂。
总之,
正则表达式会更简单,
没有那个空白错误,常规替换将按预期工作。
并且\n
和\r
将恢复到原来的位置,完好无损。
【讨论】:
以上是关于Javascript评论剥离器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 使用纯Javascript剥离HTML
JavaScript 使用javascript剥离html标签