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 将简化您的正则表达式很多!

最初即使使用 gm 修饰符(全局和“贪婪”标志),您仍然无法成功删除 cmets(除非您自定义构建“角色步行者”循环,或运行相同的reg-ex 多次...)这是由于自 ECMAScript 4 以来正则表达式匹配的一些特征(ECMA-262)


这里有什么值得一提的聪明事?

通过这种方式,我们应用了离散数学(语言和语法)中称为“语法之外的替换”的漂亮小技巧,我非常规地使用它来“保护”\r\n 中的区域文本没有实际应用太多计算能力来处理它们(如剪切/组装等)

这是一场赌博,因为从本质上讲,##R####N##(虽然不那么常见)可能是一个现有的短语,但这不是问题,因为替换可能非常复杂。

总之, 正则表达式会更简单, 没有那个空白错误,常规替换将按预期工作。 并且\n\r 将恢复到原来的位置,完好无损。

【讨论】:

以上是关于Javascript评论剥离器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

iOS - UIWebview - 3G 上的评论被剥离

SQL 剥离文本并转换为整数

JavaScript 使用纯Javascript剥离HTML

JavaScript 使用javascript剥离html标签

JavaScript 从Javascript中的字符串中剥离html标记

javascript 剥离空图像