繁体   English   中英

使用Ruby删除JavaScript中的注释

[英]Removing comments in JavaScript using Ruby

我需要一个正则表达式或一些东西来删除这种评论。

/*!
 * Foo Bar
 */

我尝试使用/(\\/*!.**\\/)/m但失败了。 有什么建议吗?

为了准确有效地做到这一点,有一个更好的正则表达式:

regexp = /\/\*![^*]*\*+(?:[^*\/][^*]*\*+)*\//
result = subject.gsub(regexp, '')

杰弗里·弗里德尔(Jeffrey Friedl)在他的经典著作《 精通正则表达式》(第3版)中详细介绍了这个特定问题(以C注释为例 以下是正则表达式的细目分类,它说明了“展开循环”效率技术。

regexp_long = / # Match she-bang style C-comment
    \/\*!       # Opening delimiter.
    [^*]*\*+    # {normal*} Zero or more non-*, one or more *
    (?:         # Begin {(special normal*)*} construct.
      [^*\/]    # {special} a non-*, non-\/ following star.
      [^*]*\*+  # More {normal*}
    )*          # Finish "Unrolling-the-Loop"
    \/          # Closing delimiter.
    /x
result = subject.gsub(regexp_long, '')

注意,此正则表达式不需要Ruby的' m'dot-matches-all修饰符,因为它不使用点!

另外:那么,此正则表达式比更简单的/\\/\\*!.*?\\*\\//m表达式效率高多少? 使用RegexBuddy调试器,我测量了每个正则表达式为匹配注释所采取的步骤。 这是匹配和不匹配的结果:(对于不匹配的情况,我只是从注释中删除了最后一个/

/*!
 * This is the example comment
 * Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
 * Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
 * Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
 */

'
REGEX                        STEPS TO: MATCH  NON-MATCH
/\/\*!.*?\*\//m                        488      491
/\/\*![^*]*\*+(?:[^*\/][^*]*\*+)*\//    23       29
'

如您所见,惰性点解决方案(必须为注释中的每个字符回退一次)的效率要低得多。 还要注意的是,随着越来越多的评论,效率差异更加明显。

CAVEAT请注意,如果开头定界符出现在文字字符串内,则该正则表达式将失败,例如“此字符串中包含/ * !!”。 要以100%的准确度正确执行此操作,您将需要完全解析脚本。

*必须转义,否则它将匹配零个或多个/ (如果是\\/* )。 .**也存在语法错误。 尝试使用*正确转义的下一个RE:

/\/\*!.*?\*\//m

您还需要转义*

/(\/\*!.*\*\/)/m

检查一下: http : //www.rubular.com/r/n2bV9qUD6k

用于删除(c样式)单行和多行注释的简单正则表达式。 但是请注意,这些操作确实很简单-例如,它们在字符串文字中不采用/ * * /的可能性。 但是从简单的代码中删除注释应该很好:

str.gsub!(/\/\*.*?\*\//m, '') # remove multiline comments
str.gsub!(/\s*\/\/.*/, '') # remove single-line comments

您可以使用YUI压缩或Google Closure编译器之类的JavaScript压缩器

好吧,我想我得到了你想要的:)

<html>
<head>
<title>Code Condenser</title>
<style type="text/css">
#source{font-size:10pt;width:90%;height:300px;}
body{text-align:center;}
</style>
<script type="text/javascript">
function vc_js_condenser(){var a=/[a-zA-Z0-9._'"]/;var b=/[a-zA-Z0-9._]/;var c=/[a-zA-Z0-9._\]\)"']/;
function d(e,f){e=e.replace(/[\n\r]+/g,"\n");var g=(typeof(f)=="boolean")?f:false;var h=["var","else",
"new","do","case","with","typeof","delete","try","finally","throw","in","instanceof"];var i=0;var j=
new Array();var k=e.split('');l=k.length;var m=new Array();var G=null;var o=false;var p=[["'","'","\\"]
,['"','"','\\'],["//","\n",null],["/*","*/",null]];var q="[](){},;/\n";var r;function s(){if(m.length<1)
return;var u=m.join('');if((!g)||((u.match(/^\/\//)==null)&&(u.match(/^\/\*/)==null))){if(!((u=="\n")&&
((G==';')||(G=="\n")))){if((G!=null)&&(G.match(a)!=null)&&(u.match(a)!=null))j[j.length]=' ';j[j.length]
=u;G=u;}}m.length=0;v=false;}var v=false;var w=false;while(i<l){if(!o){if((k[i]==" ")||(k[i]=="\t")){s();
}else{var x=false;if(q.indexOf(k[i])>-1){if(k[i]!='/'){x=true;s();}else if((m.length>0)&&(m[0]!='/')){
s();}}for(var y=0;y<p.length;y++){var z='';if((m.length>0)&&(m[m.length-1]==p[y][0].charAt(0)))z=m[
m.length-1];var A=z+k[i];if(A==p[y][0]){o=true;r=y;if(z!='')m.length--;if(m.length>0)s();if(z!='')m
[m.length]=z;break;}}if((k[i]=="/")&&(!o)&&(m.length==0)&&(G!=null)&&(G.match(c)==null)&&(i+1<k.length)
&&(k[i+1]!='/')){o=true;r=null;}var B=k[i].match(b)!=null;if(m.length<1)v=B;if(v!=B){s();v=B;}m[m.length]
=k[i];if(x)s();}}else{m[m.length]=k[i];var C=m.join('');if(r!=null){var D=C.lastIndexOf(p[r][1]);if((D!=-1)
&&(D>0)){if(m[D-1]==p[r][2]){if((D>2)&&(m[D-2]==p[r][2])){s();o=false;}}else{s();o=false;}}}else{if((w==false)
&&(k[i]=="/")){i++;while((i<k.length)&&(k[i].match(b)!=null)){m[m.length]=k[i];i++;}s();o=false;i--;}else{if
(!w&&(k[i]=="\\"))w=true;else w=false;}}}i++;}s();var E=-1;for(var i=0;i<j.length;i++){var u=j[i];var
F=(i>0)?j[i-1]:null;var n=(i<(j.length-1))?j[i+1]:null;if(u=="\n"){if((F!=null)&&(n!=null)){if((F.match(c)
!=null)&&(n.match(a)!=null)){u=';';for(var H=h.length-1;H>-1;H--){if(F==h[H])u=' ';}j[i]=u;E++;if((E<j.length)
&&(E>-1)&&(i!=E))j[E]=j[i];}}}else{E++;if((E<j.length)&&(E>-1)&&(i!=E))j[E]=j[i];}}j.length=E+1;return j;}var
I=document.getElementById('source');var J=I.value.length;I.value=d(I.value,document.getElementById('uncomment').checked
==true).join('');var K=I.value.length;var F=document.getElementById("saved");F.removeChild(F.firstChild);var
L=document.createElement("span");F.appendChild(L);L.appendChild(document.createTextNode("Original Size: "+
J+" characters"));L.appendChild(document.createElement("br"));L.appendChild(document.createTextNode(
"Condensed Size: "+K+" characters"));L.appendChild(document.createElement("br"));L.appendChild(
document.createTextNode("Size Difference: "+(J-K)+" characters"));if(J!=0){L.appendChild(document.createElement
("br"));L.appendChild(document.createTextNode("Condensed Code is "+(Math.floor(K/J*10000)/100)+
"% of original size."));}}
</script>
</head>
<body>
<h1>JavaScript Source Code Condenser</h1>
<p>Paste only valid Javascript (no HTML tags) in the box below.</p>
<button onclick="vc_js_condenser();">Condense Code</button>&nbsp;<input type="checkbox" checked="checked" id="uncomment" />Remove Comments&nbsp;<button onclick="document.getElementById('source').select();">Select All</button><br />
<textarea id="source"></textarea><br />
<p id="saved"><span></span></p>
</body>
</html>

请将该脚本另存为HTML,然后在浏览器中运行,然后复制javascript并将其放入texterea中,然后使用按钮进行压缩

该代码将删除代码上的空格和注释,因此请不要忘记以;结尾的函数; 以避免语法错误。

这将帮助您减少javascript文件的大小,这会将您的javascript排成一行,因此,如果您需要它,还可以将其重新形成,如果您使用http://www.formatjavascript.com/,则可以在firefox中使用此插件

问候:)如果您认为此答案有用,请将其标记为正确答案

我强烈建议您使用Google的Closure Compiler删除这些注释,我已经在生产中使用了它,这太棒了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM