Wenn es darum geht, Zeichenketten zu zerlegen, greifen viele PHP-Entwickler reflexartig zu explode(). Doch sobald das Trennmuster mehr sein soll als ein fester String – etwa mehrere Trennzeichen, optionale Leerzeichen oder komplexe Bedingungen – stößt explode schnell an seine Grenzen. Genau hier spielt preg_split() seine Stärken aus: Die Funktion verbindet die Leistungsfähigkeit regulärer Ausdrücke (PCRE) mit der vertrauten Array-Ausgabe einer Split-Operation.

In diesem Leitfaden lernst du, wie preg_split() funktioniert, welche Parameter und Flags es gibt, wo die Fallstricke lauern und in welchen Situationen du dennoch besser bei explode() bleibst. Zahlreiche Praxisbeispiele – von CSV-Parsing bis Log-Files – zeigen dir Schritt für Schritt, wie du selbst knifflige Zerlege-Aufgaben sauber löst.
Syntax und Parameter von preg_split() in PHP
Die folgende Übersicht zeigt die exakte Syntax sowie alle verfügbaren Parameter im Detail.
Vollständige Signatur
array|false preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
)
$pattern – das Trennmuster
- PCRE-kompatibler regulärer Ausdruck, eingerahmt von Delimitern (/…/, #…#, ~…~, …).
- Unterstützt alle Modifier wie i (case-insensitive) oder u (UTF-8).
$subject – die Eingangs-Zeichenkette
Die zu zerlegende Zeichenkette. preg_split() verändert sie nicht, sondern liefert ein neues Array.
$limit (optional)
- Maximale Anzahl der Array-Elemente.
- -1 oder 0 = kein Limit.
- Wird das Limit erreicht, enthält das letzte Element den Reststring.
preg_split('/,/', 'eins,zwei,drei,vier', 3);
/** → ['eins', 'zwei', 'drei','vier'] */
$flags (optional)
Bitmaske zur Verhaltensanpassung. Mehrere Flags kombinierst du mit |.
Rückgabewert
- Array der Teilstrings.
- false bei Regex-Fehlern (löst ein E_WARNING aus).
Die Flags von preg_split() im Detail
Im nächsten Abschnitt werden die verfügbaren Flags von preg_split() einzeln erklärt.
PREG_SPLIT_NO_EMPTY
Entfernt leere Strings aus dem Ergebnis. Ideal bei mehrfachen Delimitern.
$txt = 'rot,,blau,,grün';
preg_split('/,/', $txt, -1, PREG_SPLIT_NO_EMPTY);
/** ['rot', 'blau', 'grün'] */
PREG_SPLIT_DELIM_CAPTURE
Nimmt den Teil des Delimiters, der in Klammern () gefangen wird, ins Ergebnis-Array auf.
$str = 'name:Max alter:32 ort:Berlin';
preg_split('/(:)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
/**
['name', ':', 'Max ',
'alter', ':', '32 ',
'ort', ':', 'Berlin']
*/
PREG_SPLIT_OFFSET_CAPTURE
Jedes Element wird zu [Substring, Offset]. Perfekt, um Positionen zu bestimmen.
preg_split('/s+/', 'foo bar baz', -1, PREG_SPLIT_OFFSET_CAPTURE);
/**
[['foo', 0], ['bar', 4], ['baz', 8]]
*/
Flags kombinieren
preg_split(
'/[;,]\s*/',
'A; B, C;; D',
-1,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE
);
/**
[['A',0], ['B',3], ['C',6], ['D',11]]
*/
Praktische Beispiele für preg_split()
Anhand der folgenden Beispiele wird gezeigt, wie preg_split() in verschiedenen Situationen eingesetzt werden kann.
1. Einfache Fälle
/** Leerzeichen */
preg_split('/\s+/', 'PHP ist cool');
/** Kommas */
preg_split('/\s*,\s*/', 'rot, blau,grün , gelb');
/** Komma ODER Semikolon */
preg_split('/[;,]\s*/', '1;2,3; 4');
2. Mittelschwere Fälle
/** Wortgrenzen */
preg_split('/\b/', 'fooBar42');
/** Datumsteile */
preg_split('/[- :]/', '2025-04-27 14:55:00');
3. Beispiele mit Flags
/** NO_EMPTY */
preg_split('/,/', ',,alpha,,beta,,', -1, PREG_SPLIT_NO_EMPTY);
/** DELIM_CAPTURE */
preg_split('/(\r?\n)/', "Zeile1\nZeile2\r\nZeile3", -1, PREG_SPLIT_DELIM_CAPTURE);
/** OFFSETS */
preg_split('/[A-Z]/', 'fooBarBaz', -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_OFFSET_CAPTURE);
4. Erweiterte Beispiele
/** Leere Zeilen entfernen */
$csv = "a,b,c\n\n1,2,3\n\n";
preg_split('/\r?n/', $csv, -1, PREG_SPLIT_NO_EMPTY);
/** Operatoren behalten */
$expr = 'a+ b* c?';
preg_split('/\s*(\+|\*|\?)\s*/', $expr, -1, PREG_SPLIT_DELIM_CAPTURE);
/** Multibyte-Strings */
mb_split('p{Z}+', 'こんにちは 世界 123');
Reguläre Ausdrücke – ein 5-Minuten-Crashkurs
Damit die Arbeit mit preg_split() leichter fällt, folgt hier ein schneller Überblick über grundlegende Elemente von regulären Ausdrücken.
- Zeichenklassen [abc], Bereiche [A-Z].
- Negierte Klassen [^,] – alles außer Komma.
- Quantifier *, +, ?.
- Gruppen (), erfasst für DELIM_CAPTURE.
- Alternativen |.
- Lookahead/Lookbehind (?=…), (?<=…).
Edge-Cases & Best Practices
Zum Abschluss einige wichtige Sonderfälle und bewährte Vorgehensweisen beim Einsatz von preg_split().
- Mehrere Delimiter ⇒ PREG_SPLIT_NO_EMPTY.
- Trennzeichen am Anfang/Ende ⇒ ebenfalls NO_EMPTY.
- Unicode ⇒ immer u-Modifier oder PHP ≥ 8.0.
- Limit + Flags kombinieren ist erlaubt.
- Null-Width-Matches erzeugen Leereinträge.
- Fehler abfangen: try…catch + preg_last_error().
Aus der Praxis – vier Szenarien
Diese praktischen Anwendungsfälle zeigen, wie vielseitig preg_split() im Alltag eingesetzt werden kann.
- CSV-Parsing mit gemischten Delimitern
- Tokenisierung einfacher Ausdrücke
- Apache-Log-Zeilen trotz Leerzeichen im Pfad
- CLI-Argumente mit Quotes & Escapes
Beispiele findest du oben im Code-Block.
preg_split() vs. explode()
Zum besseren Verständnis folgt ein direkter Vergleich zwischen preg_split() und explode().

Kriterium | explode() (String) | preg_split() (Regex) |
Delimiter-Typ | fester String | beliebiges Pattern |
Mehrere Delimiter | umständlich | direkt im Pattern |
Flags | – | NO_EMPTY, DELIM_CAPTURE, OFFSET_CAPTURE |
Komplexe Bedingungen | ✗ | ✓ |
Performance | sehr schnell | langsamer (≈ 3× bei einfachen Fällen) |
Lernkurve | flach | Regex-Wissen nötig |
Daumenregel: Ein Delimiter → explode(); alles andere → preg_split().
Häufige Fehler und Fehlerbehandlung
Damit typische Stolperfallen vermieden werden, zeigt dieser Abschnitt die häufigsten Fehler und ihre Lösungen.
- Ungültiges Pattern → false + E_WARNING.
- Unerwartete leere Strings → NO_EMPTY.
- UTF-8 kaputt → u-Modifier oder mb_split().
- Limit missverstanden → Element n enthält Reststring.
Leistungsüberlegungen
Mini-Benchmark (10 MB String):
explode(): ~18 ms
preg_split(): ~61 ms
Optimierung: Pattern cachen, Gruppen reduzieren, PCRE-JIT aktuell halten.
Multibyte-Strings
- preg_split() + u-Modifier oder PHP ≥ 8.0.
- Alternative: mb_split() (POSIX-Regex, aber echtes UTF-8-Bewusstsein).
Versionen & Änderungen (Kurz)
Ein kurzer Überblick über wichtige Änderungen und Erweiterungen von preg_split() in den letzten PHP-Versionen.
- PHP 7.3: preg_last_error_msg()
- PHP 8.0: Standard UTF-8
- PHP 8.2: Named Groups im Split-Pattern
- PHP 8.4 (geplant): Flag PREG_SPLIT_NO_TRIM
Flag-Spickzettel
Der folgende Spickzettel fasst die wichtigsten Flags von preg_split() kompakt zusammen.
Flag | Wert | Typisches Szenario |
PREG_SPLIT_NO_EMPTY | 1 | doppelte Kommas in CSV |
PREG_SPLIT_DELIM_CAPTURE | 2 | Operatoren/Trennzeichen behalten |
PREG_SPLIT_OFFSET_CAPTURE | 4 | Syntax-Highlighting, Fehler-Marker |
Real-World-Bug-Story
Semikolon als Tausendertrennzeichen ruinierte ein FinTech-CSV. Fix per Lookahead:
preg_split('/;(?![0-9]{3}(?:,|$))/', $line);
Debugging-Tipps
Regex schrittweise bauen, Regex101 nutzen, nach jedem Split preg_last_error() prüfen.
Glossar
- Delimiter – Rahmenzeichen des Regex (/, #, ~, …).
- PCRE – Perl Compatible Regular Expressions.
- Backtracking – Alternativpfade, kostet Zeit.
- Null-Width-Match – Treffer ohne Länge.
Schritt-für-Schritt-Cheat-Sheet
Dieses kompakte Cheat-Sheet hilft dabei, preg_split() systematisch und effizient einzusetzen.
- Delimiter bestimmen
- Pattern bauen
- Flags wählen
- Limit setzen
- Testen & Benchmarken
- Fallback explode() bereithalten
Abschließende Gedanken
preg_split() ist das Schweizer Taschenmesser der PHP-String-Zerlegung. Sobald dein Delimiter mehr Logik verlangt als ein einfacher String, sparst du mit einem gut durchdachten Regex und den passenden Flags unzählige Nachbearbeitungs-Schritte – und damit Zeit, Wartungsaufwand und Bugs. Behalte jedoch stets die Performance im Blick und greife zurück auf explode(), wenn ein simples Trennzeichen genügt. Beherrschst du beide Werkzeuge, hast du für jede Zerlege-Aufgabe die passende Antwort in petto.