使用 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> 标记。