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() 函数中的一个压缩器。
- 获取页面html
- 删除两种类型的 JS 注释
- 将 \r\n 展平为 \r
- 将\n+\t替换为space
- 将\t替换为space
- 将双 space 替换为单个 space
- 用单个 \r 替换双 \r
把逗号+\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, "", "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&ver=4.3.1' type='text/css' media='all'/>
您当前尝试的正则表达式模式似乎不正确,(我已尝试使用 "Online RegEx Tester" 验证并确认)。
您需要将其重写为
\/\*[\s\S]*?\*\/|([^:"]|^)\/\/.*$
这是来自 https://regex101.com/#javascript 的屏幕截图(我在其中测试了上述模式)
尝试在 reReplace
功能中使用 \/\*[\s\S]*?\*\/|([^:"]|^)\/\/.*$
,这将为您锻炼身体。
希望对您有所帮助!
你可以试试这个:
<!--- 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, "", "ALL")>
正则表达式:
Branch 1: ("\/\/[^"]*?") ==> Capture(to replace with same later i.e., ) 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&ver=4.3.1' type='text/css' media='all'/>
我想使用 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() 函数中的一个压缩器。
- 获取页面html
- 删除两种类型的 JS 注释
- 将 \r\n 展平为 \r
- 将\n+\t替换为space
- 将\t替换为space
- 将双 space 替换为单个 space
- 用单个 \r 替换双 \r
把逗号+\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, "", "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&ver=4.3.1' type='text/css' media='all'/>
您当前尝试的正则表达式模式似乎不正确,(我已尝试使用 "Online RegEx Tester" 验证并确认)。
您需要将其重写为
\/\*[\s\S]*?\*\/|([^:"]|^)\/\/.*$
这是来自 https://regex101.com/#javascript 的屏幕截图(我在其中测试了上述模式)
尝试在 reReplace
功能中使用 \/\*[\s\S]*?\*\/|([^:"]|^)\/\/.*$
,这将为您锻炼身体。
希望对您有所帮助!
你可以试试这个:
<!--- 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, "", "ALL")>
正则表达式:
Branch 1: ("\/\/[^"]*?") ==> Capture(to replace with same later i.e., ) 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&ver=4.3.1' type='text/css' media='all'/>