Вызов функции внутри функции ReReplace - PullRequest
1 голос
/ 17 мая 2011

Есть ли способ написать в Coldfusion что-то вроде:

< cfset ReReplace(value,"&#\d+;","#decodeHtmlEntity(\1)#", "all") >

Большое спасибо

Ответы [ 3 ]

1 голос
/ 17 мая 2011

Краткий ответ - «Нет».

CF не обрабатывает выполнение регулярного выражения изначально.Он передает библиотеку Java (Oro, IIRC), чтобы справиться с этим.Это означает, что любые функции CF, которые вы вызываете, выполняются за до регулярного выражения.

Существует обходной путь, хотя он не так элегантен, как возможность передавать функции.Используйте reFind (), чтобы обнаружить все экземпляры того, что вы ищете, и переназначить их один за другим.Если вы выполняете замену «первым-первым» (например, если есть 3 экземпляра, выполните 3-й, затем 2-й, а затем 1-й), ваша начальная точка для каждого матча останется в том же месте, так что вы сможете выполнить повторный поиск всехвместо повторного поиска в цикле.

HTH.

0 голосов
/ 17 мая 2011

Я не думаю, что это сработает, если вы захотите заменить значение регулярного выражения в качестве аргумента decodeHTMLEntity.

Обновлено:

   <cfset myVar = ReReplace("ABC123DEF","(\d+)",addOne('\1'), "all") >
   <cffunction name="addOne" access="public" output="false" returntype="string">
    <cfargument name="arg1" required="true" type="string" />
    <cfreturn arg1 + 1>
</cffunction>
<cfdump var="#myvar#">

Над кодом, написанным для поиска 123 из текста идобавьте один в него, но это не будет работать, так как arg1 будет иметь \ 1, который не является числовым значением.

0 голосов
/ 17 мая 2011

Вы пытались просто использовать URLDecode (значение)?

Или, если вы специально хотите декодировать только числовые html-коды, тогда

<cfset myVar = ReReplace(value,"(&##[\d+];)",urlDecode('\1'), "all") >

сделает то, что вам нужно.

Чтобы объяснить, что он делает:

  • Я заменил функцию PHP decodeHTMLEntity на версию CFML.
  • Если вы хотите использовать обратные ссылки, вам нужно указать группы перехвата в шаблоне регулярных выражений.
  • вам нужно удвоить эти #, чтобы избежать их, иначе CF будет искать #, который никогда не найдет.
...