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