正则表达式(preg_split):如何基于分隔符进行拆分,不包括一对引号中包含的分隔符?

时间:2014-07-28 21:25:46

标签: 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()

所以我的问题是,如何基于分隔符进行拆分,不包括一对引号内的分隔符?

我有点想避免先用引号捕捉东西,理想情况下要把它当成一个衬里。

3 个答案:

答案 0 :(得分:5)

您可以使用:

$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
)

答案 1 :(得分:5)

您可以使用以下内容。

$text = '1 2 3 4/5/6 "7/8 9" 10';
$results = preg_split('~"[^"]*"(*SKIP)(*F)|[ /]+~', $text);
print_r($results);

<强>解释

在交替运算符的左侧,我们匹配引号中的任何内容,使子模式失败,强制正则表达式引擎不使用(*SKIP) and (*F)的回溯控制重试子字符串。交替运算符的右侧匹配空格字符或不带引号的正斜杠。

<强>输出

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => "7/8 9"
    [7] => 10
 )

答案 2 :(得分:4)

使用可选组的另一种方式:

$arr = preg_split('~(?:"[^"]*")?\K[/\s]+~', $s);

模式"[^"]*"[/\s]+匹配引用的部分,后跟一个或多个空格和斜杠。但是,由于您不想删除引用的部分,因此请在其后面添加\K\K会从匹配结果中删除左侧匹配的所有内容。有了这个技巧,当找到一个引用的部分时,正则表达式引擎只返回空格或斜线并在它们之后拆分。

由于在空格或斜线之前并不总是有引用的部分,因此您只需将其设为可选的非捕获组(?:...)和问号?