簡體   English   中英

CFML RegEx刪除JavaScript注釋

[英]CFML RegEx to remove javascript 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代替雙\\ r
  8. 用逗號替換逗號+ \\ r

     <!--- 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 /> 

和一些真實的(但被截斷的)輸出可用於:

<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'/>

您可以嘗試以下方法:

<!--- 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

由OP解決。

正確的替換是:

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'/> 

您當前正在嘗試的正則表達式模式似乎不正確,(我嘗試使用“ Online RegEx Tester”對其進行驗證並確認)。

您需要將其重寫為

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

這是https://regex101.com/#javascript的屏幕截圖(我在上面測試過的模式)

在此處輸入圖片說明

嘗試在reReplace功能中使用\\/\\*[\\s\\S]*?\\*\\/|([^:"]|^)\\/\\/.*$ ,它將為您鍛煉。

希望這對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM