如何将字符串分割("explode")成"chunk "我定义的


How can I split ("explode") a string into "chunks" that I define?

我希望使用正则表达式将字符串分解成块。我知道preg_split(),但我仍然在努力解决Regex方面的问题(即使preg_split()在这里有所帮助)。老实说,我甚至不知道我是否应该使用正则表达式。

我的意思是,如果我有一个这样的字符串:

?word word2 word3 "word4 word5 word6" 'word7' word8

我想把结果分割成一个数组,像这样:

Array
(
    [0] => ?word
    [1] => word2
    [2] => word3
    [3] => word4 word5 word6
    [4] => word7
    [5] => word8
)

基本上,一个块应该用空格分隔,但你可以在一组字符周围放置任何类型的引号来组成一个块。

我最初尝试用空格爆炸,然后连接以"或"开头的值,直到达到以"或"结尾的值。但是我想一定有更好的办法。

谢谢!

使用(?|"(.*?)"|'(.*?)'|('S+))捕获所有所需的值到preg_match_all():

$str = "?word word2 word3 '"word4 word5 word6'" 'word7' word8";
$regex = "/(?|'"(.*?)'"|'(.*?)'|('S+))/";
preg_match_all($regex, $str, $matches);
print_r($matches[1]);

演示:https://ideone.com/0AhB22

感谢Mark Baker的解决方案^。

使用str_getcsv()分隔字符串,如下所示:

$string = '?word word2 word3 "word4 word5 word6" word7';
$string = str_getcsv($string, ' ', '"', '''');

生产:

Array
(
    [0] => ?word
    [1] => word2
    [2] => word3
    [3] => word4 word5 word6
    [4] => word7
)

您可以尝试以下regex和preg_match_all():

$regex = '/(?<=[''"])(?:[^ "''][^"'']*)|[^''" ]+/';
$subject = '?word word2 word3 "word4 word5 word6" ''word7'' word8';
preg_match_all($regex, $subject, $result);
var_dump($result[0]);

我假设你的块不包含引号,除非它们用于分组多个单词。