我希望使用正则表达式将字符串分解成块。我知道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]);
我假设你的块不包含引号,除非它们用于分组多个单词。