CFLib.org – Common Function Library Project

Split(str[, splitstr][, treatsplitstrasstr])

Last updated February 12, 2005

author

Steven Van Gemert

Version: 3 | Requires: CF5 | Library: StrLib

Description:
Splits a string according to another string or multiple delimiters. ColdFusion's native list functions do not allow you to pass a multi-character delimiter. You can use this function to split the string into an array. Version 2 was written by Raymond Camden (ray@camdenfamily.com). Split will now correctly return a one item array if the split string is not found. More importantly, the split function now works as the split functions do in other languages - when multiple split strings are found in the original string, then appropriate blank-stringed array elements are made. For example, If you split the string "19991" using the string "9" as the split string, the resulting array will now correctly have 4 elements instead of the previous versions result of 3 elements. This is how the split function behaves in other languages. Also included is the option to treat the split string as multiple delimiters, as the native ColdFusion list functions do. This might not be necessary for all applications, but I included it to ensure the best functionality. Pass a boolean false as the third parameter to treat the split string as multiple delimiters. I also changed the split string parameter to be optional, defaulting to a comma.

Return Values:
Returns an array.

Example:

<cfset foo = "99rifle_._2999.00_._199.00_x_ray91">
<cfoutput>#foo#</cfoutput><hr>
<cfset x = split(foo,"9")>
<cfdump var="#x#">
<hr>
<cfset x = split(foo,"19","no")>
<cfdump var="#x#">

Parameters:

Name Description Required
str String to split. Yes
splitstr String to split on. Defaults to a comma. No
treatsplitstrasstr If false, splitstr is treated as multiple delimiters, not one string. No

Full UDF Source:

/**
 * Splits a string according to another string or multiple delimiters.
 * 
 * @param str 	 String to split. (Required)
 * @param splitstr 	 String to split on. Defaults to a comma. (Optional)
 * @param treatsplitstrasstr 	 If false, splitstr is treated as multiple delimiters, not one string. (Optional)
 * @return Returns an array. 
 * @author Steven Van Gemert (svg2@placs.net) 
 * @version 3, February 12, 2005 
 */
function split(str) {
	var results = arrayNew(1);
	var splitstr = ",";
	var treatsplitstrasstr = true;
	var special_char_list      = "\,+,*,?,.,[,],^,$,(,),{,},|,-";
	var esc_special_char_list  = "\\,\+,\*,\?,\.,\[,\],\^,\$,\(,\),\{,\},\|,\-";	
	var regex = ",";
	var test = "";
	var pos = 0;
	var oldpos = 1;

	if(ArrayLen(arguments) GTE 2){
		splitstr = arguments[2]; //If a split string was passed, then use it.
	}
	
	regex = ReplaceList(splitstr, special_char_list, esc_special_char_list);
	
	if(ArrayLen(arguments) GTE 3 and isboolean(arguments[3])){
		treatsplitstrasstr = arguments[3]; //If a split string method was passed, then use it.
		if(not treatsplitstrasstr){
			pos = len(splitstr) - 1;
			while(pos GTE 1){
				splitstr = mid(splitstr,1,pos) & "_Separator_" & mid(splitstr,pos+1,len(splitstr) - (pos));
				pos = pos - 1;
			}
			splitstr = ReplaceList(splitstr, special_char_list, esc_special_char_list);
			splitstr = Replace(splitstr, "_Separator_", "|", "ALL");
			regex = splitstr;
		}
	}
	test = REFind(regex,str,1,1);
	pos = test.pos[1];

	if(not pos){
		arrayAppend(results,str);
		return results;
	}

	while(pos gt 0) {
		arrayAppend(results,mid(str,oldpos,pos-oldpos));
		oldpos = pos+test.len[1];
		test = REFind(regex,str,oldpos,1);
		pos = test.pos[1];
	}
	//Thanks to Thomas Muck
	if(len(str) gte oldpos) arrayappend(results,right(str,len(str)-oldpos + 1));

	if(len(str) lt oldpos) arrayappend(results,"");

	return results;
}
blog comments powered by Disqus

Search CFLib.org


Latest Additions

Kevin Cotton added
date2ExcelDate
May 5, 2016

Raymond Camden added
CapFirst
April 25, 2016

Chris Wigginton added
loremIpsum
January 18, 2016

Gary Stanton added
calculateArrival...
November 19, 2015

Sebastiaan Naafs - van Dijk added
getDaysInQuarter
November 13, 2015

Created by Raymond Camden / Design by Justin Johnson