Использование URLEncodedFormat с REReplace - PullRequest
2 голосов
/ 12 апреля 2010

Я пытаюсь изменить экземпляры следующей строки:

URL: http://www.google.com/?s= test

до

URL: <a href="http://www.google.com/?s=%20test">http://www.google.com/?s= test</a>

обратите внимание, что URL-адрес якоря закодирован

Мне удалось разобрать часть URL, используя очень простое регулярное выражение:

<cfset getFacts.fact_details = REReplace(getFacts.fact_details,
"URL:[ ]*([^#chr(13)##chr(10)#]+)",
"URL: <a href='\1' target='_blank'>\1</a>", "ALL")><!--- URL to newline into link --->

, который просто захватывает содержимое после "URL:" до новой строки

Как я могу включить URLEncodedFormat с этим или использовать все регулярные выражения?

Ответы [ 2 ]

4 голосов
/ 12 апреля 2010

Вам нужно будет сделать это в отдельных шагах, поскольку вы не можете использовать вызовы функций в RegEx.

Сначала получите адрес URL с помощью REFind. У вас уже есть регулярное выражение для этого.

Теперь используйте mid (), чтобы получить только URL. Сохраните это в переменной для манипуляции. Удалите URL: part, а затем выполните вызов URLEncodedFormat (). Я бы сохранил это в отдельной переменной, чтобы вы могли отобразить URL-адрес в том виде, в котором он был введен изначально. Используйте эти две переменные для создания строки замены (ссылки).

Теперь вы можете создать свой результат, используя left () и right (), чтобы извлечь то, что находится до и после вашего URL, и вставив строку замены между ними.

Вид PITA, но он там есть.

0 голосов
/ 13 апреля 2010

Зачем вообще использовать регулярные выражения? Есть хорошие функции списка, которые идеально подходят для работы.

<cfoutput>
  <cfset BrokenUrl = "http://www.google.com/?s= test&f=%20foo%20&g&g/=/">
  <cfset FixedUrl  = FixUnencodedUrl(BrokenUrl)>
  #HTMLEditFormat(FixedUrl)#
  <!--- prints: http://www.google.com/?s=%20test&f=%20foo%20&g=&g%2F=%2F --->
</cfoutput>

<cffunction name="FixUnencodedUrl" returntype="string" access="public">
  <cfargument name="UrlStr" type="string" required="yes">

  <cfset var UrlPath  = ListFirst(UrlStr, "?")>
  <cfset var UrlQuery = ListRest(UrlStr, "?")>
  <cfset var NewQuery = "">
  <cfset var part     = "">
  <cfset var name     = "">
  <cfset var value    = "">

  <cfloop list="#UrlQuery#" index="part" delimiters="&">
    <cfset name  = ListFirst(part, "=")>
    <cfset value = ListRest(part, "=")>
    <!--- only encode if not already encoded --->
    <cfif name eq URLDecode(name)>
      <cfset name = URLEncodedFormat(name)>
    </cfif>
    <cfif value eq URLDecode(value)>
      <cfset value = URLEncodedFormat(value)>
    </cfif>
    <!--- build new, encoded query string --->
    <cfset NewQuery = ListAppend(NewQuery, "#name#=#value#", "&")>
  </cfloop>

  <cfreturn ListAppend(UrlPath, NewQuery, "?")>
</cffunction>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...