PHP explode the string, but treat words in quotes as a single word PHP explode the string, but treat words in quotes as a single word php php

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);