PHP explode the string, but treat words in quotes as a single word
You could use a preg_match_all(...)
:
$text = 'Lorem ipsum "dolor sit amet" consectetur "adipiscing \\"elit" dolor';preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches);print_r($matches);
which will produce:
Array( [0] => Array ( [0] => Lorem [1] => ipsum [2] => "dolor sit amet" [3] => consectetur [4] => "adipiscing \"elit" [5] => dolor ))
And as you can see, it also accounts for escaped quotes inside quoted strings.
EDIT
A short explanation:
" # match the character '"'(?: # start non-capture group 1 \\ # match the character '\' . # match any character except line breaks | # OR [^\\"] # match any character except '\' and '"')* # end non-capture group 1 and repeat it zero or more times" # match the character '"'| # OR\S+ # match a non-whitespace character: [^\s] and repeat it one or more times
And in case of matching %22
instead of double quotes, you'd do:
preg_match_all('/%22(?:\\\\.|(?!%22).)*%22|\S+/', $text, $matches);
This would have been much easier with str_getcsv()
.
$test = 'Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor';var_dump(str_getcsv($test, ' '));
Gives you
array(6) { [0]=> string(5) "Lorem" [1]=> string(5) "ipsum" [2]=> string(14) "dolor sit amet" [3]=> string(11) "consectetur" [4]=> string(15) "adipiscing elit" [5]=> string(5) "dolor"}
You can also try this multiple explode function
function multiexplode ($delimiters,$string){$ready = str_replace($delimiters, $delimiters[0], $string);$launch = explode($delimiters[0], $ready);return $launch;}$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";$exploded = multiexplode(array(",",".","|",":"),$text);print_r($exploded);