2
<cffunction name="foo">
     <cfargument name="default">
     <cfoutput>#ARGUMENTS.default#</cfoutput>
     <cfreturn ARGUMENTS.default />
</cffunction>

<cfset LOCAL.derp = "((bar))" />
<cfset LOCAL.derp = LOCAL.derp.replaceAll("\(\((.*)\)\)", foo('$1')) />
<cfoutput>#LOCAL.derp#</cfoutput>

The output I am expecting is bar bar however I am getting $1 bar. How can this be done in ColdFusion9?

4

1 に答える 1

5

foo 関数が最初に評価され、その関数の文字列結果がその後 replaceAll に渡されます。replaceAll は、その入力が関数を介して提供されたことを知りません。

String.replaceAllは、正規表現パターン文字列と置換文字列を受け入れる Java メソッドです。コールバック関数を直接渡すことはできません。


これに対する解決策は、私が作成したcfRegex ライブラリを使用することです。これには、すべての一致に対して実行される関数を渡すことができるReplace 関数があります。

これは次のように使用できます。

<cfset Local.Derp = RegexReplace
    ( Pattern     = '\(\((.*)\)\)'
    , Text        = Local.Derp
    , Replacement = replaceWithG1AndOutput
    ) />

<cffunction name="replaceWithG1AndOutput" returntype="String" output=true>
    <!---
        Use Arguments.Match for "((bar))"
        or Arguments.Groups[1].Match for "bar"
    --->
    <cfoutput>#Arguments.Groups[1].Match#</cfoutput>
    <cfreturn Arguments.Groups[1].Match />
</cffunction>
于 2012-09-21T14:19:32.310 に答える