Проблема с якорными ссылками с использованием resolurl - PullRequest
0 голосов
/ 09 октября 2019

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Похоже, нет способа предотвратить разрешение хэшей CF. При его использовании текущий результат на самом деле полезен, поскольку, когда мы представляем контент с другого сайта, мы обычно хотим, чтобы пользователь туда отправлялся.

Вот способ заменить значения ссылки href просто привязкой, если одинпредставить с помощью регулярных выражений. Я уверен, что есть комбинации проблем, которые могут возникнуть здесь, если действительно искаженный HTML.

<code><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)#

Вывод

    <strong>test</strong>
    <a href="http://google.com">go to google</a>
    <a href="#section>go to section</a>

ДругойЕсли вы отображаете содержимое на обычной странице с доступным js / jquery, вам нужно пройти по каждой отображаемой ссылке и обновить ее, чтобы она была привязкой. Это будет менее вероятной ошибкой с искаженным HTML. Дайте мне знать, если вы заинтересованы в таком подходе.

0 голосов
/ 09 октября 2019

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

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

В такой ситуации невозможно предположить.

...