Проблема с якорными ссылками с помощью resolveurl

Я использую <cfhttp> для получения контента с другого сайта (coldfusion) и resolveurl="true", поэтому все ссылки работают. Проблема, с которой я сталкиваюсь, заключается в том, что resolveurl делает якорные ссылки (href="#search") абсолютными ссылками, а также ломает их. Мой вопрос: есть ли способ заставить resolveurl="true" как-то обходить якорные ссылки?


person dbaker6    schedule 09.10.2019    source источник
comment
Прокрутите результат и запустите REPLACE для соответствующих ссылок, чтобы обрезать их обратно до якорей? helpx.adobe.com/coldfusion/cfml- ссылка/coldfusion-функции/   -  person TRose    schedule 09.10.2019
comment
Спасибо... мои навыки холодного синтеза ограничены. Я не уверен, как это закодировать. Это ссылка href=ccri.edu:443/_resources-2019/includes /#search это то, что должно быть href=#search   -  person dbaker6    schedule 09.10.2019
comment
а также сломать их сломать их КАК? Абсолютный URL-адрес с якорем вполне допустим.   -  person SOS    schedule 14.10.2019


Ответы (2)


Для начала воспользуемся кодом учебника с 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-адреса и анализирует их на наличие якорей.

Вам придется решить, что делать дальше внутри вашего цикла. Может быть, сохранить значения и добавить их в новый массив, чтобы вы могли сохранить его где-нибудь с исправленными ссылками?

Предполагать в такой ситуации нельзя.

person TRose    schedule 09.10.2019

Кажется, нет способа предотвратить разрешение 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. Дайте мне знать, если вы заинтересованы в этом подходе.

person Dan Roberts    schedule 10.10.2019