2017-02-05 1 views

Antwort

3

Split auf Alternative zwischen [ und ], und verwenden Sie die Flagge PREG_SPLIT_NO_EMPTY keine leeren Teile fangen.

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

Ausgang:

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

NB.

Dank @ WiktorStribiżew, seine Regex /[][]/ ist viel effizienter, ich habe ein Benchmark, es ist etwa 40% schneller.

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

Hier ist der Perl-Skript ich verwendet habe, die Benchmark zu tun:

#!/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); 
    }, 
}); 

Ergebnis: (2 Läufe)

>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 
+0

Während das Muster ist einfach, du kannst es sogar noch besser schreiben, wie ""/[] []/"' –

+0

@ WiktorStribiżew: True, aber meine Regex erscheint mir lesbarer. Es ist nur ein Punkt von vue – Toto

+0

Sicher, es ist immer eine Frage des Geschmacks/Stils. Ich bevorzuge Präzision und Leistung zur Lesbarkeit. –

2

Verwenden Sie eine einfache regex jeden [...] anzupassen Unterstring (\[[^][]*]) und wickeln Sie das gesamte Muster mit einer einfangenden Gruppe - dann können Sie es mit preg_split undverwendenFlagge sowohl die Captures und den Teil in zwischen den Spielen zu bekommen:

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

Siehe PHP demo

Mit diesem Ansatz können Sie eine bessere Kontrolle über das, was Sie in eckigen Klammern entsprechen, wie Sie einstellen können das Muster, um nur Zeitbereiche, z

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

A [10:42-23:10]part1[11:30-13:20]part2[4][5] wird in [10:42-23:10], erhalten aufgeteilt part1, [11:30-13:20] und part2[4][5] (man beachte die [4][5] nicht geteilt out).

Siehe this regex demo

1

Ohne regex verwenden können, können Sie strtok verwenden:

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