$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] =>
答案 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_split
和PREG_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]
未拆分)。
答案 3 :(得分:1)
如果没有正则表达式,您可以使用strtok
:
$result = [];
$tok = strtok($str, '[]');
do {
if (!empty($tok))
$result[] = $tok;
} while (false !== $tok = strtok('[]'));