REReplaceCallback(string, pattern, callback[, scope])
Last updated March 10, 2010
Version: 1 | Requires: CF8 | Library: CFMLLib
Description:
With the built-in REReplace function you can only supply a static replace string (parameterized with backreferences, of course). This UDF allows you to supply a function callback that will be passed all matches (including subexpressions) allowing you to use arbitrary CFML to construct the replacement string dynamically.
Return Values:
Returns a string.
Example:
<cfscript>
string = "The catapult bifurcated the bearcat.";
fancyString = REReplaceCallback(string, "(\w*)(cat)(\w*)", doit, "all");
function doit(match) {
if (match[2] EQ "") {
return '#match[2]#<b><i>#match[3]#</i></b>#match[4]#';
} else {
return '<u>#match[2]#<b><i>#match[3]#</i></b>#match[4]#</u>';
}
}
</cfscript>
Parameters:
Name | Description | Required |
---|---|---|
string | String to parse. | Yes |
pattern | Regex pattern to use. | Yes |
callback | UDF to be used as a callback. | Yes |
scope | How many replacements should be made. Defaults to one. | No |
Full UDF Source:
<!---
REReplaceCallback behaves like REReplace, except instead of supplying a replacement string, you supply a function to invoke on each match.
@param string String to parse. (Required)
@param pattern Regex pattern to use. (Required)
@param callback UDF to be used as a callback. (Required)
@param scope How many replacements should be made. Defaults to one. (Optional)
@return Returns a string.
@author Barney Boisvert (bboisvert@gmail.com)
@version 1, March 10, 2010
--->
<cffunction name="REReplaceCallback" access="private" output="false" returntype="string">
<cfargument name="string" type="string" required="true" />
<cfargument name="pattern" type="string" required="true" />
<cfargument name="callback" type="any" required="true" />
<cfargument name="scope" type="string" default="one" />
<cfscript>
var start = 0;
var match = "";
var parts = "";
var replace = "";
var i = "";
var l = "";
while (true) {
match = REFind(pattern, string, start, true);
if (match.pos[1] EQ 0) {
break;
}
parts = [];
l = arrayLen(match.pos);
for (i = 1; i LTE l; i++) {
if (match.pos[i] EQ 0) {
arrayAppend(parts, "");
} else {
arrayAppend(parts, mid(string, match.pos[i], match.len[i]));
}
}
replace = callback(parts);
start = start + len(replace);
string = mid(string, 1, match.pos[1] - 1) & replace & removeChars(string, 1, match.pos[1] + match.len[1] - 1);
if (scope EQ "one") {
break;
}
}
return string;
</cfscript>
</cffunction>
Search CFLib.org
Latest Additions
Raymond Camden added
QueryDeleteRows
November 04, 2017
Leigh added
nullPad
May 11, 2016
Raymond Camden added
stripHTML
May 10, 2016
Kevin Cotton added
date2ExcelDate
May 05, 2016
Raymond Camden added
CapFirst
April 25, 2016