strtok()
Die PHP-Funktion strtok() zerlegt eine Zeichenkette in kleinere Teile (Tokens) anhand von Trennzeichen. Syntax, Beispiele und Fallstricke.
Einführung
Die Funktion strtok() in PHP zerlegt eine Zeichenkette in kleinere Teile, die als Tokens bezeichnet werden. Ein Token ist ein Textabschnitt zwischen Trennzeichen — einzelnen Zeichen wie einem Leerzeichen, Komma oder Zeilenumbruch, die angeben, wo ein Teil endet und der nächste beginnt.
Was strtok() besonders macht, ist seine Zustandsbehaftung: Die Funktion merkt sich ihre Position in der Zeichenkette zwischen den Aufrufen. Man liest das erste Token, ruft die Funktion dann immer wieder auf, um das nächste Token zu lesen, bis die Zeichenkette erschöpft ist. Diese Seite behandelt die Syntax, wie der interne Zeiger funktioniert, häufige Fallstricke und wann stattdessen explode() verwendet werden sollte.
Syntax
strtok(string $string, string $delimiter): string|false
// continuation call:
strtok(string $delimiter): string|falseEs gibt zwei Möglichkeiten, die Funktion aufzurufen:
| Form | Bedeutung |
|---|---|
strtok($string, $delimiter) | Startet die Tokenisierung von $string und gibt das erste Token zurück. |
strtok($delimiter) | Setzt ab der vorherigen Stelle fort und gibt das nächste Token zurück. |
Wichtige Hinweise zu den Parametern:
$delimiterist eine Menge von Zeichen, kein mehrteiliges Trennzeichen." !?"bedeutet „trenne bei einem Leerzeichen, einem Ausrufezeichen oder einem Fragezeichen" — jedes Zeichen ist ein eigenes Trennzeichen. Es wird nicht auf die buchstäbliche dreizeichenlange Zeichenkette" !?"aufgeteilt.- Das Trennzeichen kann zwischen Aufrufen geändert werden, was der Hauptgrund ist,
strtok()gegenüberexplode()zu bevorzugen. - Die Funktion gibt
falsezurück, wenn keine weiteren Tokens vorhanden sind (oder wenn$delimiterleer ist), sodass sie als Schleifenbedingung verwendet werden kann.
Ab PHP 8.1+ ist die alte Fortsetzungsform
strtok(null, $delimiter)veraltet (deprecated). Verwende die einstellige Formstrtok($delimiter), um fortzufahren.
Grundlegendes Beispiel: Tokens in einer Schleife durchlaufen
Das typische Muster ist ein Aufruf zum Starten und dann eine while-Schleife, die weiter Tokens liest, bis strtok() false zurückgibt:
<?php
$string = "Hello World! How are you?";
$delimiter = " !?";
$token = strtok($string, $delimiter); // first token
while ($token !== false) {
echo $token . "\n";
$token = strtok($delimiter); // next token (single-arg form)
}Ausgabe:
Hello
World
How
are
youVerwende einen strikten !== false-Vergleich, nicht nur while ($token). Ein Token mit dem Wert "0" ist in PHP falsy, sodass eine lockere Prüfung bei legitimen Daten vorzeitig abbricht.
Aufeinanderfolgende Trennzeichen werden übersprungen
Im Gegensatz zu explode() behandelt strtok() eine Folge von Trennzeichen als einzelnes Trennzeichen und gibt niemals leere Tokens zurück:
<?php
$tok = strtok("a,,b", ",");
while ($tok !== false) {
echo "[$tok]\n";
$tok = strtok(",");
}Ausgabe:
[a]
[b]Das leere Stück zwischen den zwei Kommas wird stillschweigend verworfen. explode(",", "a,,b") würde stattdessen ["a", "", "b"] zurückgeben. Wenn leere Felder erhalten bleiben müssen (z. B. bei CSV-Daten), sollte strtok() nicht verwendet werden.
Das Trennzeichen mitten beim Parsen ändern
Da der interne Zeiger erhalten bleibt, kann das Trennzeichen zwischen Aufrufen gewechselt werden — praktisch für das Parsen von key=value-Daten:
<?php
$line = "name=John; age=30";
$key = strtok($line, "="); // split on "=" → "name"
$value = strtok(";"); // now split on ";" → " John"
echo trim($key) . "\n";
echo trim($value) . "\n";Ausgabe:
name
JohnNur die erste Zeile lesen
Eine schnelle Methode, um nur die erste Zeile einer mehrzeiligen Zeichenkette zu lesen, ohne ein Array aus allen Zeilen zu erzeugen:
<?php
$text = "first line\nsecond line\nthird line";
$firstLine = strtok($text, "\n");
echo $firstLine . "\n";Ausgabe:
first linestrtok() vs. explode()
Beide Funktionen teilen Zeichenketten auf, verhalten sich jedoch unterschiedlich:
strtok() | explode() | |
|---|---|---|
| Gibt zurück | ein Token pro Aufruf | ein ganzes Array auf einmal |
| Trennzeichen | eine Menge einzelner Zeichen | eine feste mehrteilige Zeichenkette |
| Leere Felder | werden übersprungen | werden beibehalten |
| Zustand | zustandsbehaftet (interner Zeiger) | zustandslos |
Für den größten Teil modernen Codes ist explode() leichter nachzuvollziehen und funktioniert gut mit Array-Funktionen. strtok() sollte verwendet werden, wenn ein tokenweises, träges Lesen benötigt wird oder das Trennzeichen mitten im Durchlauf gewechselt werden soll. Für kommagetrennte Daten mit Anführungszeichen empfiehlt sich str_getcsv().
Häufige Fallstricke
- Der interne Zeiger ist global pro Zeichenkette. Wird mitten in einer Schleife eine andere Funktion aufgerufen, die
strtok()verwendet, wird die aktuelle Position korrumpiert. Eine Tokenisierung muss vollständig abgeschlossen werden, bevor eine neue beginnt. - Die Quellzeichenkette darf bei der Fortsetzung nicht erneut übergeben werden.
strtok($string, $delimiter)startet jedes Mal von vorne. Die Fortsetzung muss die einstellige Form verwenden. - Leere Felder verschwinden. Wie oben gezeigt, kann
strtok()nicht erkennen, dass ein Feld leer war.
Fazit
strtok() durchläuft eine Zeichenkette Token für Token, teilt sie an jedem Zeichen einer Trennzeichenmenge auf und hält zwischen den Aufrufen einen internen Zeiger. Seine Zustandsbehaftung macht es ideal für träges Parsen und für den Wechsel des Trennzeichens mitten im Durchlauf, während sein Verwerfen leerer Felder es ungeeignet für spaltenbasierte Daten macht. Wenn alle Teile als Array benötigt werden, ist explode() meist die klarere Wahl; zum Aufteilen in Abschnitte fester Länge siehe str_split().