如何将一个字符串拆分("爆炸")到" chunk"我定义的?

时间:2016-08-23 09:17:55

标签: php regex

我希望使用正则表达式将字符串分解为块。我知道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
)

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

我最初尝试通过空格进行爆炸,然后连接以"开头的值。或者'直到我达到以"结尾的值或者'。但我认为必须有更好的方法。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用(?|"(.*?)"|'(.*?)'|(\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

答案 1 :(得分:0)

感谢Mark Ba​​ker的解决方案^。

使用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
)

答案 2 :(得分:0)

您可以尝试使用以下正则表达式和preg_match_all()

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

preg_match_all($regex, $subject, $result);
var_dump($result[0]);

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