我有一个位于<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')>
这样可行,但有更简洁的方法吗?
答案 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>
标记。