preg_split
Die Funktion preg_split() in PHP teilt einen String anhand eines regulären Ausdrucks in ein Array von Teilstrings auf.
Einführung
preg_split() teilt einen String in ein Array von Teilstrings auf, wobei ein regulärer Ausdruck als Trennzeichen verwendet wird. Es ist der regex-gestützte Verwandte von
explode(): Während explode() nur auf einen festen String aufteilen kann, kann preg_split() auf einem Muster aufteilen — beliebige Leerzeichen, eines von mehreren Satzzeichen, eine Zifferngrenze und so weiter.
Diese Seite behandelt die Funktionssignatur, alle Flags, den Rückgabewert sowie praktische Muster (und Fallstricke), die beim Einsatz in echtem Code auftreten.
Syntax
preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
): array|false| Parameter | Beschreibung |
|---|---|
$pattern | Der reguläre Ausdruck als Trennzeichen, einschließlich Begrenzungszeichen wie /.../. |
$subject | Der aufzuteilende Eingabe-String. |
$limit | Maximale Anzahl der Teile. -1 (Standard) oder 0 bedeutet kein Limit. Wenn gesetzt, enthält das letzte Element den nicht aufgeteilten Rest. |
$flags | Bitmaske aus PREG_SPLIT_*-Konstanten (siehe unten). Mit ` |
Die Funktion gibt bei Erfolg ein Array von Teilstrings zurück oder false, wenn das Muster ungültig ist. Sie wirft keine Ausnahme — prüfen Sie auf false (und siehe
preg_last_error()), wenn ein Aufteilen fehlschlagen kann.
Ein einfaches Beispiel
Ein klassischer Anwendungsfall ist das Aufteilen eines Strings auf ein Trennzeichen, das variiert — hier beliebige Leerzeichen oder Kommas:
Das Muster [\s,]+ trifft auf ein oder mehrere Leerzeichen- oder Kommazeichen zu, sodass sowohl die Leerzeichen als auch das Komma als Trennzeichen wirken:
Array
(
[0] => This
[1] => is
[2] => a
[3] => test
[4] => string
)Da + gierig ist, werden aufeinanderfolgende Trennzeichen (ein Komma und ein Leerzeichen) zu einem einzigen Trennpunkt zusammengefasst, anstatt leere Elemente zu erzeugen.
Die Flags
PREG_SPLIT_NO_EMPTY
Ohne dieses Flag erzeugt ein Trennzeichen ganz am Anfang oder Ende des Strings — oder zwei aufeinanderfolgende Trennzeichen, die das Muster nicht zusammenführen kann — leere Strings im Ergebnis. PREG_SPLIT_NO_EMPTY entfernt diese:
<?php
$string = ',apple,,banana,';
// Without the flag: empty pieces appear.
print_r(preg_split('/,/', $string));
// With the flag: only real values remain.
print_r(preg_split('/,/', $string, -1, PREG_SPLIT_NO_EMPTY));Der erste Aufruf liefert ['', 'apple', '', 'banana', '']; der zweite liefert
['apple', 'banana'].
PREG_SPLIT_DELIM_CAPTURE
Enthält das Muster Capture-Gruppen, schließt dieses Flag den erfassten Text ins Ergebnis ein — nützlich, wenn die Trennzeichen erhalten bleiben sollen, statt verworfen zu werden:
<?php
$expression = '3+5*2-9';
$tokens = preg_split('/([+\-*\/])/', $expression, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($tokens);Das Ergebnis behält sowohl die Zahlen als auch die Operatoren:
['3', '+', '5', '*', '2', '-', '9'] — genau das, was ein einfacher Ausdruck-Tokenizer benötigt.
PREG_SPLIT_OFFSET_CAPTURE
Jedes Element wird zu einem [$substring, $offset]-Paar, wobei $offset die Byte-Position im ursprünglichen String ist. Praktisch, wenn Sie wissen müssen, woher jedes Teil stammt.
Die Anzahl der Aufteilungen begrenzen
$limit begrenzt die Anzahl der zurückgegebenen Teile; das letzte Element behält den Rest des Strings unaufgeteilt. Dies ist die idiomatische Methode, um „die ersten N Felder und dann alles andere" aufzuteilen:
<?php
$logLine = 'ERROR 2024-01-01 Something broke: details here';
// Split into at most 3 parts on whitespace.
$parts = preg_split('/\s+/', $logLine, 3);
print_r($parts);Das liefert ['ERROR', '2024-01-01', 'Something broke: details here'] — das dritte Element behält seine inneren Leerzeichen, da das Limit erreicht wurde.
preg_split() vs. explode()
Verwenden Sie explode(), wenn das Trennzeichen ein einzelner fester String ist — es ist schneller und klarer. Verwenden Sie preg_split(), wenn das Trennzeichen ein Muster ist: variable Leerzeichen, eine Auswahl von Zeichen, Groß-/Kleinschreibung-unabhängiges Matching oder wenn Sie die Trennzeichen über PREG_SPLIT_DELIM_CAPTURE behalten möchten. Um ein Array wieder zu einem String zusammenzufügen, verwenden Sie implode().
Häufige Fallstricke
- Fehlende Muster-Begrenzer. Das erste Argument ist ein vollständiger regulärer Ausdruck und benötigt daher Begrenzer:
'/,/', nicht','. Einen nackten String zu übergeben ist der häufigste Anfängerfehler. - Nicht maskierte Sonderzeichen. Zeichen wie
.,+,|und*sind Regex-Metazeichen. Um auf einen wörtlichen Punkt aufzuteilen, maskieren Sie ihn ('/\./') oder verwenden Siepreg_quote()bei dynamischen Eingaben. - Unerwünschte leere Strings. Führende/nachfolgende Trennzeichen erzeugen leere Elemente — fügen Sie
PREG_SPLIT_NO_EMPTYhinzu, wenn Sie diese nicht möchten.
Verwandte Funktionen
explode()— Aufteilen auf ein festes String-Trennzeichen.implode()— Ein Array wieder zu einem String zusammenfügen.preg_match()/preg_match_all()— Übereinstimmungen finden statt aufzuteilen.preg_replace()— Text durch Muster ersetzen.