Is There a Way to Use Multiple Delimiters With the PHP explode() Function?

By default, the PHP explode() function does not allow specifying multiple delimiters. However, there are other ways in which you achieve the same result:

Using str_replace() and explode()

You can make all the delimiters in the string the same using str_replace() by passing an array of delimiters as the first argument to the function. After that you can use explode() as you normally would on the resulting string. For example:

$delimiters = ['.', '!', '?'];
$str = 'foo! bar? baz.';
$newStr = str_replace($delimiters, $delimiters[0], $str); // 'foo. bar. baz.'

$arr = explode($delimiters[0], $newStr);

echo print_r($arr, true); // ['foo', 'bar', 'baz', '']

If you want to remove empty values from the matches, then you can use the array_filter() function on the resulting array like so:

$delimiters = ['.', '!', '?'];
$str = 'foo! bar? baz.';
$newStr = str_replace($delimiters, $delimiters[0], $str); // 'foo. bar. baz.'

$arr = explode($delimiters[0], $newStr);
$filteredArr = array_filter($arr);

echo print_r($filteredArr, true); // ['foo', 'bar', 'baz']

Please note that the array_filter() function preserves the array keys (which may result in gaps in an indexed array). Reindexing the array should be possible with array_values().

Using preg_split()

Instead of using the explode() function, you could use preg_split(). With it you can specify a regular expression with multiple delimiters and split a string into an array. For example:

$str = 'foo! bar? baz.';
$arr = preg_split('/[.|!|?]/', $str);

echo print_r($arr, true); // ['foo', bar, baz, '']

If you want to remove non-empty values from the matches, then you can simply pass in the PREG_SPLIT_NO_EMPTY flag as the fourth argument to preg_split() like so:

$str = 'foo! bar? baz.';
$arr = preg_split('/[.|!|?]/', $str, -1, PREG_SPLIT_NO_EMPTY);

echo print_r($arr, true); // ['foo', bar, baz]

This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.