Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Regex(preg_split):如何基于分隔符进行分割,不包括一对引号中包含的分隔符?_Php_Regex_Preg Split - Fatal编程技术网

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正则表达式引擎中使用。