Php Regex(preg_split):如何基于分隔符进行分割,不包括一对引号中包含的分隔符?
我将此拆分为:Php Regex(preg_split):如何基于分隔符进行分割,不包括一对引号中包含的分隔符?,php,regex,preg-split,Php,Regex,Preg Split,我将此拆分为: 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_
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);
说明:
在alternation操作符的左侧,我们匹配引号中的任何内容,使子模式失败,从而强制正则表达式引擎不使用回溯控制重试子字符串。alternation运算符的右侧匹配空格字符或不在引号中的正斜杠
输出
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你能解释一下表达式中发生了什么吗?谢谢你的帮助!@Theamydese:我添加了一个解释。也谢谢你的解释!哈哈。起初我把它解释为讽刺,然后我记得这篇文章是为regex.trolol写的f有用的preg_split
标记很少出现在答案中。:)谢谢@zx81:在这种情况下,使用这些标记使正则表达式非常简单,可能也可以在非PCRE正则表达式引擎中使用。