使用RegEx从HTML代码的SCRIPT部分提取URL

时间:2015-02-27 19:35:46

标签: regex coldfusion

我有一个位于<script>标记内的网址,我需要提取该网址:

使用ReMatchNoCase(),我可以找到脚本并将其放入数组中。

<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>

要提取网址,我使用以下代码

<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)>
<cfset link = Replacenocase(Replace(listLast(ulink[1],'='),'"','','ALL'),';</script>','','all')>

这样可行,但有更简洁的方法吗?

2 个答案:

答案 0 :(得分:1)

因为ReFind/NoCase()不是为了返回实际的子字符串而设计的,所以这就像你要获得的一样简单。

<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]*","\2","ALL")>
<cfoutput>#ulink#</cfoutput>

这可能会更好,但是如果出现这种情况,那么处理多个<script>标签的可读性会非常糟糕,并且可靠性较低。

就个人而言,我会选择第一条路线。使用RegEx,有时候&#34; lazier&#34;你试着成为,整个事物变得更加震撼。最好定义达到目标的最佳模式,在ColdFusion中,我相信第一条路线是最好的路线。

答案 1 :(得分:0)

您可以执行以下操作:

<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>标记内的所有网址。我使用正向预测确保后面有</script>结束标记,并且否定预测,以确保没有其他<script>标记。