Split/explode a string in PHP with an escape character
Explode with escape
This seems like a simple task that should be supported natively in PHP. Unfortunately it's not. The problem is taking a string e.g.
a,b,c\,d,e,f
And splitting it on , while ignoring any commas that have been escaped using \. There are a few solutions online using RegEx, however that feels like overkill for such a simple task. Here's a simple piece of code that performs an escaped split without needing regular expressions:
$foo = 'a,b,c\\,d,e';
function explodeEscaped($delimiter, $str, $escapeChar = '\\') {
//Just some random placeholders that won't ever appear in the source $str
$double = "\0\0\0_doub";
$escaped = "\0\0\0_esc";
$str = str_replace($escapeChar . $escapeChar, $double, $str);
$str = str_replace($escapeChar . $delimiter, $escaped, $str);
$split = explode($delimiter, $str);
foreach ($split as &$val) $val = str_replace([$double, $escaped], [$escapeChar, $delimiter], $val);
return $split;
}
print_r(explodeEscaped(',', $foo, '\\'));
Note: Because \ has special meaing in PHP it has to be escaped in the string when declaring $foo!
This prints:
Array ( [0] => a [1] => b [2] => c,d [3] => e )
To be consistet with other escape characters, it also supports double escaping in case you need an escape character in the original string for example:
a,b,c\,d,e\\,f
The second last element here should be "e\" because the \ is escaped and treated like a normal \
$foo = 'a,b,c\\,d,e\\\\,f';
print_r(explodeEscaped(',', $foo, '\\'));
Note: Because \ has special meaing in PHP it has to be escaped in the string when declaring $foo so \\ becomes \\\\
Prints:
Array ( [0] => a [1] => b [2] => c,d [3] => e\ [4] => f )