如何使用php preg_split从字符串中获取括号以外的所有内容?

时间:2017-02-05 14:10:56

标签: php regex string preg-split

$str = "[10:42-23:10]part1[11:30-13:20]part2"

我希望将其拆分为:

[1] 10:42-23:10
[2] part1
[3] 11:30-13:20
[4] part2

我设法提出的最好的是:

$parts = preg_split("/(\\[*\\])\w+/", $str );

但是这会返回

[0] => [10:42-23:10
[1] => [11:30-13:20
[2] =>

4 个答案:

答案 0 :(得分:3)

[]之间进行拆分,并使用标记PREG_SPLIT_NO_EMPTY来捕捉空白部分。

$str = "[10:42-23:10]part1[11:30-13:20]part2";
$parts = preg_split("/\[|\]/", $str, -1, PREG_SPLIT_NO_EMPTY );
print_r($parts);

<强>输出:

Array
(
    [0] => 10:42-23:10
    [1] => part1
    [2] => 11:30-13:20
    [3] => part2
)

<强> NB。

感谢@WiktorStribiżew,他的正则表达式/[][]/效率更高,我有一些基准测试,它的速度提高了大约40%。

$str = "[10:42-23:10]part1[11:30-13:20]part2";
$parts = preg_split("/[][]/", $str, -1, PREG_SPLIT_NO_EMPTY );
print_r($parts);

以下是我用来做基准测试的perl脚本:

#!/usr/bin/perl
use Benchmark qw(:all);

my $str = "[10:42-23:10]part1[11:30-13:20]part2";

my $count = -5;
cmpthese($count, {
    '[][]' => sub {
        my @parts = split(/[][]/, $str);
    },
    '\[|\]' => sub {
        my @parts = split(/\[|\]/, $str);
    },
});

结果:(2次运行)

>perl -w benchmark.pl
          Rate \[|\]  [][]
\[|\] 536640/s    --  -40%
[][]  891396/s   66%    --
>Exit code: 0

>perl -w benchmark.pl
          Rate \[|\]  [][]
\[|\] 530867/s    --  -40%
[][]  885242/s   67%    --
>Exit code: 0

答案 1 :(得分:3)

您也可以在preg_match_all()中使用正则表达式而不是preg_split()

$str = "[10:42-23:10]part1[11:30-13:20]part2";
preg_match_all("/[^\[\]]+/", $str, $parts);
print_r($parts[0]);

请参阅demo

中的结果

答案 2 :(得分:2)

使用简单的正则表达式匹配任何[...]子字符串(\[[^][]*])并将整个模式与捕获组包装起来 - 然后您可以将其与preg_splitPREG_SPLIT_DELIM_CAPTURE一起使用flag以获取两次匹配中的捕获和子串:

$re = '/(\[[^][]*])/';
$str = '[10:42-23:10]part1[11:30-13:20]part2';
$matches = preg_split($re, $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($matches);

请参阅PHP demo

使用这种方法,您可以更好地控制方括号内的匹配,因为您可以将模式调整为仅匹配时间范围,例如

(\[\d{2}:\d{2}-\d{2}:\d{2}])

[10:42-23:10]part1[11:30-13:20]part2[4][5]将分为[10:42-23:10]part1[11:30-13:20]part2[4][5](请注意[4][5]未拆分)。

请参阅this regex demo

答案 3 :(得分:1)

如果没有正则表达式,您可以使用strtok

$result = [];
$tok = strtok($str, '[]');
do {
    if (!empty($tok))
        $result[] = $tok;
} while (false !== $tok = strtok('[]'));