我正在使用<cfhttp>
从另一个站点(coldfusion)提取内容,resolveurl="true"
因此所有链接都有效。我遇到的问题resolveurl
是使锚链接(href="#search")
成为绝对链接以及破坏它们。我的问题是有没有办法以resolveurl="true"
某种方式绕过锚链接?
问问题
138 次
2 回答
0
对于初学者,让我们使用评论中发布的 Adobe.com 的教程代码。你会想做类似的事情。
<cfhttp url="https://www.adobe.com"
method="get" result="httpResp" timeout="120">
<cfhttpparam type="header" name="Content-Type" value="application/json" />
</cfhttp>
<cfscript>
// Find all the URLs in a web page retrieved via cfhttp
// The search is case sensitive
result = REMatch("https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?", httpResp.Filecontent);
</cfscript>
<!-- Now, Loop through those URLs--->
<cfoutput>
<cfloop array="#result#" item="item" index="index">
<cfif LEFT(item, 1) is "##">
<!---Your logic if it's just an anchor--->
<cfelse>
<!---Your logic if it's a full link--->
</cfif>
<br/>
</cfloop>
</cfoutput>
如果它试图在您所说的锚点之前返回一个完整的 URL,(我得到的结果不一致resolveurl="true"
)用这个来点击它,只获取您想要的位。
<cfoutput>
<cfloop array="#result#" item="item" index="index">
#ListLast(item, "##")#
</cfloop>
</cfoutput>
这段代码所做的是抓取所有 URL,并解析它们以查找锚点。
您必须决定在循环中下一步要做什么。也许保留这些值并将它们添加到一个新数组中,这样你就可以将它保存在链接固定的地方?
在这种情况下是不可能假设的。
于 2019-10-09T19:58:08.027 回答
0
似乎没有办法阻止 CF 解析哈希。在我们使用它时,当前结果实际上是有益的,因为当我们展示来自另一个站点的内容时,我们通常希望将用户发送到那里。
如果使用正则表达式存在锚点,则这是一种仅用锚点替换链接href值的方法。我敢肯定,如果真的 html 格式不正确,这里可能会出现多种问题。
<cfsavecontent variable="testcontent">
<strong>test</strong>
<a href="http://google.com">go to google</a>
<a href="http://current.domain/thispage#section">go to section</a>
</cfsavecontent>
<cfset domain = replace("current.domain", ".", "\.", "all") />
<cfset match = "(href\s*=\s*(""|'))\s*(http://#domain#[^##'""]+)(##[^##'""]+)\s*(""|')" />
<cfset result = reReplaceNoCase(testcontent, match, "\1\4\6", "all") />
<cfoutput><pre>#encodeForHTML(result)#</pre></cfoutput>
输出
<strong>test</strong>
<a href="http://google.com">go to google</a>
<a href="#section>go to section</a>
如果您在具有可用 js/jquery 的普通页面中显示内容,另一种选择是运行显示的每个链接并将其更新为仅作为锚点。对于格式错误的 html,这不太可能出错。如果您对这种方法感兴趣,请告诉我。
于 2019-10-10T13:26:38.477 回答