CFML RegEx删除javascript注释

时间:2016-09-15 14:43:02

标签: javascript regex coldfusion comments

我希望使用coldfusion从字符串中删除javascript注释。我目前正在使用reReplace(string, "(\/\*.*\*\/)|\s(\/\/.{1,}[\r\n])", "", "all")

这是一个测试字符串:

<script type="text/javascript">
// comment
var a=1; // another comment
/* try{if (...)}; */
var b=2;
</script>
src="//domain.com"

预期的结果是(以及我在javacript中使用replace()获得的结果):

<script type="text/javascript">
var a=1; 
var b=2;
</script>
src="//domain.com"

实际CFML结果:

<script type="text/javascript">
src="//domain.com"

再次,它可以在javascript中运行。

如何在CFML中使用它?

更新1,我的应用程序中更具体的代码。 它基本上是app.cfc的OnRequest()函数中的缩小器。

  1. 获取页面html
  2. 删除两种类型的JS评论
  3. 拼合\ r \ n到\ r
  4. 将\ n + \ t替换为空格
  5. 将\ t替换为空格
  6. 用单个空格替换双倍空格
  7. 用单个\ r \ n
  8. 替换double \ r \ n
  9. 用逗号

    替换逗号+ \ r \ n

    <!--- Define arguments. --->
    <cfargument
        name="TargetPage"
        type="string"
        required="true"
        />
    
    <cfheader name="content-type" value="text/html; charset=utf-8" />
    <cfheader name="X-UA-Compatible" value="IE=edge" />
    <cfheader name="window-target" value="_top" />
    <cfheader name="imagetoolbar" value="no" />
    <cfheader name="viewport" value="wwidth=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
    
    <cfsavecontent variable="finalContent">
    <cfinclude template="#ARGUMENTS.TargetPage#" />
    </cfsavecontent>
    
    <cfset variables.regex = '(?:("\/\/[^"]*?")|\/\*.*?\*\/|\/\/.*?\n)'>
    <!--- <cfset finalContent = reReplace(finalContent,variables.regex, "\1", "ALL")> --->
    <cfset finalContent = replace(finalContent,  chr(13), chr(10), 'all')>
    <cfset finalContent = replace(finalContent,  chr(10)&chr(9), ' ', 'all')>
    <cfset finalContent = replace(finalContent,  chr(9), ' ', 'all')>
    <cfloop from="1" to="20" index="e">
        <cfset finalContent = replace(finalContent, '  ', ' ', 'all')>
        <cfset finalContent = replace(finalContent, chr(10)&chr(10), chr(10), 'all')>
    </cfloop>
    <cfset finalContent = replace(finalContent,  ','&chr(10), ',', 'all')>
    <cfset finalContent = replace(finalContent,  chr(10), '', 'all')>
    
    <cfoutput>#finalContent#</cfoutput>
    
    <cfreturn />
    

  10. 还有一些真正的(但截断的)输出:

    <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
    <script type="text/javascript">
    //<![CDATA[
    try{if (...) {...;}} catch(e){};
    //]]>
    // comment
    var a=1; // another comment
    /* try{if (...)}; */
    var b=2;
    </script>
    <script type="text/javascript">
     unsavedChanges=0;
     tinymce.init({
         // GENERAL
         // PLUGINS
         // LINK
         link_list: "/pagesJSON.cfm", target_list: [
             {title: 'Same Window/Tab', value: '_self'}, {title: 'New Window/Tab', value: '_blank'}
         ],
         // FILE MANAGER
         external_filemanager_path: '/filemanager/',
         // IMAGE
         image_advtab: true
     });
     </script>
    <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Lato%3A400%2C700%2C900&#038;ver=4.3.1' type='text/css' media='all'/>
    

3 个答案:

答案 0 :(得分:5)

你可以试试这个:

<!--- JS with comment --->
<cfsavecontent variable="variables.jsWithCommment">
    <script type="text/javascript">
    // comment
    var a=1; // another comment
    /* try{if (...)}; */
    var b=2;
    </script>
    src="//domain.com"
</cfsavecontent>

<!--- Replace with first capture for each branch --->
<cfset variables.regex = '(?:("\/\/[^"]*?")|\/\*.*?\*\/|\/\/.*?\n)'>
<cfset variables.jsWithoutComment = reReplace(variables.jsWithCommment, variables.regex, "\1", "ALL")>

<强>正则表达式:

Branch 1: ("\/\/[^"]*?")  ==> Capture(to replace with same later i.e., \1) URL shorthand
Branch 2: \/\*.*?\*\/     ==> MultiLine Comment
Branch 3: \/\/.*?\n       ==> SingleLine Comment

这是TryCF

答案 1 :(得分:0)

OP解决方案。

正确的reReplace是:

reReplace(finalContent, '\/\*.*?\*\/|\s(\/\/.*?\r\n)', "", "ALL")

进行以下输出。仍然需要一些清洁,但链接和js功能不会中断!

<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
    <script type="text/javascript">
       try{if (...) {...;}} catch(e){};
          var a=1;    
    var b=2;
    </script>
    <script type="text/javascript">
     unsavedChanges=0;
     tinymce.init({
                                 link_list: "/pagesJSON.cfm", target_list: [
             {title: 'Same Window/Tab', value: '_self'}, {title: 'New Window/Tab', value: '_blank'}
         ],
                 external_filemanager_path: '/filemanager/',
                 image_advtab: true
     });
     </script>
    <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Lato%3A400%2C700%2C900&#038;ver=4.3.1' type='text/css' media='all'/> 

答案 2 :(得分:-1)

您当前正在尝试的正则表达式模式似乎不正确,(我尝试使用“在线RegEx测试程序”验证它并确认)。

您需要将其重写为

\/\*[\s\S]*?\*\/|([^:"]|^)\/\/.*$

以下是https://regex101.com/#javascript(我测试过上述模式的地方)的截图

enter image description here

尝试使用\/\*[\s\S]*?\*\/|([^:"]|^)\/\/.*$功能中的reReplace来为您锻炼。

希望这能帮到你!

相关问题