Coldfusion 在ReReplace函数中调用函数

Coldfusion 在ReReplace函数中调用函数,coldfusion,Coldfusion,有没有一种方法可以在coldfusion中编写如下内容: < cfset ReReplace(value,"&#\d+;","#decodeHtmlEntity(\1)#", "all") > 非常感谢您是否尝试过简单地使用URLDecode(value) 或者,如果您只想解码数字html代码,那么 <cfset myVar = ReReplace(value,"(&##[\d+];)",urlDecode('\1'), "all") > 我会

有没有一种方法可以在coldfusion中编写如下内容:

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


非常感谢

您是否尝试过简单地使用URLDecode(value)

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

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

我会做你需要的

要解释它正在做什么:

  • 我已经用CFML版本替换了PHP DecodeHtmlenty函数
  • 如果要使用反向引用,则需要在正则表达式模式中指定捕获组
  • 你需要双倍增加这些来逃离它们,否则CF将寻找一个永远也找不到的结局

如果您想将正则表达式值替换为decodehtmlenty的参数,我认为这是行不通的

更新:

   <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不是数值。

简短的回答是“否”

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

有一种变通方法,尽管它远没有传递函数那么优雅。使用reFind()发现您正在查找的所有实例,并逐个重新放置它们。如果从最后到第一次执行替换(例如,如果有3个实例,则执行第3次,然后执行第2次,然后执行第1次),则每次匹配的起点将保持在同一位置,因此可以执行全部重新查找,而不是在循环中执行重新查找


HTH.

虽然CF将其几乎所有功能交给java是正确的,但这句话的其余部分是不正确的。请参阅下面我的回复,了解一个正在运行且经过测试的解决方案。您在哪个版本中测试成功?今晚回家时我可以检查9,但它在6.1中不起作用(我工作的地方使用的),我记得它在7或8中不能正常工作……诚然,它是针对9.0.1的,我明天会针对8进行确认。回复:cfmx 6.1-yikes!你需要帮助!呵呵。运行6.1不是我的主意。但情况可能更糟——我们可能在5点上。:-)这是我能想到的唯一方法。你可以在“replace-with”属性的函数中包装来自正则表达式的反向引用。请参阅我的工作答案。@Stephen,当您调用urlDecode('\1')时,它将\1作为参数值而不是正则表达式计算值传递。有关更好的解释,请参见下面的代码
code
code
这里我只想从给定字符串中找出数字,并在其中添加一个,但这不会像在函数“ADDONE”中那样工作,您将收到\1作为arg1而不是123。好的,所以我下面的工作代码似乎只在ColdFusion 9中工作。我没有在任何其他引擎上试过。没有,我也在CF9上测试过,它不会工作。但是,您的代码将作为urlDecode函数accept string和process on string工作,但在您的情况下,urlDecode函数将返回\1,稍后将由REREPLACE函数替换。根据正在进行的讨论,这显然是版本=-相关的。您使用的是什么版本的CF?您在那里使用的urlDecode方法将仅在字符串“\1”上运行,它不会应用于找到的值。