我希望使用正则表达式将字符串分解为块。我知道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
)
基本上一个块应该用空格分隔,但是你可以在一组字符周围放置任何类型的引用来制作一个块。
我最初尝试通过空格进行爆炸,然后连接以"开头的值。或者'直到我达到以"结尾的值或者'。但我认为必须有更好的方法。
谢谢!
答案 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]);
答案 1 :(得分:0)
感谢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
)
答案 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]);
我假设您的块不包含引号,除非它们用于分组多个单词。