在ReReplace函数内调用函数

时间:2011-05-17 12:13:15

标签: coldfusion

有没有办法在coldfusion中写一些像:

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

非常感谢

3 个答案:

答案 0 :(得分:1)

简短的回答是“不”。

CF本身不处理正则表达式执行。它交给了一个Java库(Oro,IIRC)来处理它。这意味着您调用的任何CF函数都会在 toe regex之前执行

有一种解决方法,虽然它不像能够传递函数那样优雅。使用reFind()来发现您正在寻找的所有实例,并逐个重新编译它们。如果你做的是自上而下的替换(例如,如果有3个实例,做第3个,然后是第2个,那么第1个)你的每个匹配的起点将保持在同一个位置,所以你可以重新找到所有,而不是在循环中进行reFind。

HTH。

答案 1 :(得分:0)

如果您想将正则表达式值替换为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,这不是数值。

答案 2 :(得分:-1)

您是否尝试过使用URLDecode(值)?

或者,如果您只是想要解码数字html代码,那么

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

会做你需要的。

解释它在做什么:

  • 我已经用CFML版本替换了PHP decodeHTMLEntity函数。
  • 如果要使用反向引用,则需要在正则表达式模式中指定捕获组。
  • 你需要加倍那些#来逃避它们,否则CF会寻找一个它永远找不到的关闭#。