0

我正在使用<cfhttp>从另一个站点(coldfusion)提取内容,resolveurl="true"因此所有链接都有效。我遇到的问题resolveurl是使锚链接(href="#search")成为绝对链接以及破坏它们。我的问题是有没有办法以resolveurl="true"某种方式绕过锚链接?

4

2 回答 2

0

对于初学者,让我们使用评论中发布的 Adob​​e.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 回答