使用 RegEx 从 HTML 代码的 SCRIPT 部分提取 URL
Extract URL from SCRIPT portion of HTML Code with RegEx
我有一个 URL,它位于 <script>
标签内,我需要提取 URL:
使用ReMatchNoCase()
,我可以找到脚本并将它放在一个数组中。
<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>
要提取 URL,我使用以下代码
<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)>
<cfset link = Replacenocase(Replace(listLast(ulink[1],'='),'"','','ALL'),';</script>','','all')>
这行得通,但是有更简洁的方法吗?
因为 ReFind/NoCase()
不是为 return 实际子字符串设计的,所以这与您将要获得的一样简单。
<cfset data='<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>'>
<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)>
<cfset link = Rematchnocase("http[^""']*",ulink[1])>
<cfoutput>#link[1]#</cfoutput>
这 比您正在做的要简单一些。或者,您可以使用 Mid(ulink[1]...)
,但使用 ReFindNoCase()
中的子表达式,但它也不简单。
我用来匹配 URL 的正则表达式非常通用,但它应该很容易完成任务。它只是捕获所有内容,直到找到引号或撇号。
我也想到了这个
<cfset data='<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>'>
<cfset ulink = rereplacenocase(data,"[\s\S]*?(<script.*?>[\s\S]*?(http[^""']*)[\s\S]*?</script>)[\s\S]*","","ALL")>
<cfoutput>#ulink#</cfoutput>
这可能更好,但它读起来更难,而且在处理多个 <script>
标签时不太可靠。
就我个人而言,我会选择第一条路线。使用 RegEx,有时您尝试成为 "lazier",整个事情变得越不稳定。最好定义实现目标的最佳模式,在 ColdFusion 中,我相信第一条路线是最好的路线。
您可以执行以下操作:
<cfset data = '<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>' />
<cfset start = REFindNoCase("<script[^>]*>", data) />
<cfset match = REMatchNoCase("https?://[^'""]*(?=.*</script>)(?!.*<script>)", mid(data, start, len(data) - start + 1)) />
在第二行中,我找到了 <script>
开放标签的位置(尽管对于这个特定的数据片段不是绝对必要的)。在第 3 行中,我在 <script>
标记内找到了任何 URL。我使用正前瞻来确保后面有一个 </script>
结束标记,并使用 负 前瞻来确保没有另一个 <script>
标记。
我有一个 URL,它位于 <script>
标签内,我需要提取 URL:
使用ReMatchNoCase()
,我可以找到脚本并将它放在一个数组中。
<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>
要提取 URL,我使用以下代码
<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)>
<cfset link = Replacenocase(Replace(listLast(ulink[1],'='),'"','','ALL'),';</script>','','all')>
这行得通,但是有更简洁的方法吗?
因为 ReFind/NoCase()
不是为 return 实际子字符串设计的,所以这与您将要获得的一样简单。
<cfset data='<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>'>
<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)>
<cfset link = Rematchnocase("http[^""']*",ulink[1])>
<cfoutput>#link[1]#</cfoutput>
这 比您正在做的要简单一些。或者,您可以使用 Mid(ulink[1]...)
,但使用 ReFindNoCase()
中的子表达式,但它也不简单。
我用来匹配 URL 的正则表达式非常通用,但它应该很容易完成任务。它只是捕获所有内容,直到找到引号或撇号。
我也想到了这个
<cfset data='<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>'>
<cfset ulink = rereplacenocase(data,"[\s\S]*?(<script.*?>[\s\S]*?(http[^""']*)[\s\S]*?</script>)[\s\S]*","","ALL")>
<cfoutput>#ulink#</cfoutput>
这可能更好,但它读起来更难,而且在处理多个 <script>
标签时不太可靠。
就我个人而言,我会选择第一条路线。使用 RegEx,有时您尝试成为 "lazier",整个事情变得越不稳定。最好定义实现目标的最佳模式,在 ColdFusion 中,我相信第一条路线是最好的路线。
您可以执行以下操作:
<cfset data = '<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>' />
<cfset start = REFindNoCase("<script[^>]*>", data) />
<cfset match = REMatchNoCase("https?://[^'""]*(?=.*</script>)(?!.*<script>)", mid(data, start, len(data) - start + 1)) />
在第二行中,我找到了 <script>
开放标签的位置(尽管对于这个特定的数据片段不是绝对必要的)。在第 3 行中,我在 <script>
标记内找到了任何 URL。我使用正前瞻来确保后面有一个 </script>
结束标记,并使用 负 前瞻来确保没有另一个 <script>
标记。