W3docs

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|false

Es gibt zwei Möglichkeiten, die Funktion aufzurufen:

FormBedeutung
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:

  • $delimiter ist 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 dreizeichen­lange Zeichenkette " !?" aufgeteilt.
  • Das Trennzeichen kann zwischen Aufrufen geändert werden, was der Hauptgrund ist, strtok() gegenüber explode() zu bevorzugen.
  • Die Funktion gibt false zurück, wenn keine weiteren Tokens vorhanden sind (oder wenn $delimiter leer ist), sodass sie als Schleifenbedingung verwendet werden kann.

Ab PHP 8.1+ ist die alte Fortsetzungsform strtok(null, $delimiter) veraltet (deprecated). Verwende die einstellige Form strtok($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
you

Verwende 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
John

Nur 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 line

strtok() vs. explode()

Beide Funktionen teilen Zeichenketten auf, verhalten sich jedoch unterschiedlich:

strtok()explode()
Gibt zurückein Token pro Aufrufein ganzes Array auf einmal
Trennzeicheneine Menge einzelner Zeicheneine feste mehrteilige Zeichenkette
Leere Felderwerden übersprungenwerden beibehalten
Zustandzustandsbehaftet (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().

Übung

Übung
Was macht die PHP-Funktion strtok?
Was macht die PHP-Funktion strtok?
Was this page helpful?