I split this:
1 2 3 4/5/6 "7/8 9" 10
将内容转换为:
1
2
3
4
5
6
"7/8 9"
10
使用preg_split()
我的问题是,如何根据分隔符拆分字符串,但要排除在引号对中的分隔符?
我想避免首先捕获引号中的内容,并希望它是一个一行代码。
I split this:
1 2 3 4/5/6 "7/8 9" 10
将内容转换为:
1
2
3
4
5
6
"7/8 9"
10
使用preg_split()
我的问题是,如何根据分隔符拆分字符串,但要排除在引号对中的分隔符?
我想避免首先捕获引号中的内容,并希望它是一个一行代码。
您可以使用:
$s = '1 2 3 4/5/6 "7/8 9" 10';
$arr = preg_split('~("[^"]*")|[ /]+~', $s, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
print_r( $arr );
输出:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => "7/8 9"
[7] => 10
)
$text = '1 2 3 4/5/6 "7/8 9" 10';
$results = preg_split('~"[^"]*"(*SKIP)(*F)|[ /]+~', $text);
print_r($results);
解释:(*SKIP)
和(*F)
的回溯控制强制正则表达式引擎不再重试子字符串。交替运算符的右侧匹配空格字符或不在引号内的斜杠符号。
输出:Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => "7/8 9"
[7] => 10
)
另一种方法是使用可选组:
$arr = preg_split('~(?:"[^"]*")?\K[/\s]+~', $s);
"[^"]*"[/\s]+
匹配一个带引号的部分,其后跟一个或多个空格和斜杠。但是由于您不想删除带引号的部分,所以在其后放置了\K
。 \K
从匹配结果中删除左侧已匹配的所有内容。使用此技巧,当发现带引号的部分时,正则表达式引擎仅返回其后的空格或斜杠,并在它们上进行拆分。(?:...)
和问号?
使其成为可选项。\K
+1。 - hwnd
preg_split
标志。 :) - zx81