Signatur
Beschreibung
strtok() zerlegt einen String in Teilstrings (Token), die durch eines oder mehrere Trennzeichen aus $token begrenzt werden. Im Gegensatz zu explode() arbeitet strtok() zustandsbehaftet: Beim ersten Aufruf wird der zu zerlegende String übergeben, alle weiteren Aufrufe erhalten nur noch die Trennzeichen – der interne Zeiger wird dabei automatisch weitergeschoben.
Die Funktion gibt bei jedem Aufruf das nächste Token als String zurück. Sind keine weiteren Token mehr vorhanden, wird false zurückgegeben. Mehrere aufeinanderfolgende Trennzeichen werden dabei als ein Trennzeichen behandelt – leere Token entstehen also nicht, was das Verhalten von strtok() von explode() unterscheidet.
Typische Einsatzgebiete sind das Parsen einfacher, durch Leerzeichen oder Kommas getrennter Listen, das Tokenisieren von Konfigurationszeilen oder das Auslesen von Pfadkomponenten. Für komplexere Anwendungsfälle (z. B. wenn leere Felder erhalten bleiben sollen) ist explode() oder preg_split() meist besser geeignet.
Achtung: Da der interne Zeiger global (pro Thread) gespeichert wird, kann das gleichzeitige Tokenisieren mehrerer Strings im selben Kontext zu unerwarteten Ergebnissen führen. Verschachtelte strtok()-Aufrufe sind daher zu vermeiden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der zu zerlegende Ausgangsstring. Dieser Parameter wird nur beim ersten Aufruf übergeben; bei Folgeaufrufen wird er ignoriert und der interne Zeiger automatisch weitergesetzt. | |
| $token Pflicht | string | Ein String, der alle Zeichen enthält, die als Trennzeichen dienen sollen. Jedes Zeichen in diesem String gilt einzeln als mögliches Trennzeichen, nicht der gesamte String als Sequenz. |
Rückgabewert
false, wenn keine weiteren Token vorhanden sind.Beispiele
Einfache Zerlegung eines durch Leerzeichen getrennten Satzes
<?php
$string = 'Das ist ein einfacher Satz';
$token = strtok($string, ' ');
while ($token !== false) {
echo $token . PHP_EOL;
$token = strtok(' ');
}
Mehrere Trennzeichen gleichzeitig verwenden
<?php
// Komma, Semikolon und Leerzeichen als Trennzeichen
$csv = 'rot,grün; blau , gelb;lila';
$token = strtok($csv, ', ;');
$farben = [];
while ($token !== false) {
$farben[] = $token;
$token = strtok(', ;');
}
print_r($farben);
Unterschied zu explode(): aufeinanderfolgende Trennzeichen
<?php
// strtok ignoriert aufeinanderfolgende Trennzeichen (keine leeren Token)
$string = 'eins zwei drei';
$token = strtok($string, ' ');
echo 'strtok:' . PHP_EOL;
while ($token !== false) {
var_dump($token);
$token = strtok(' ');
}
echo PHP_EOL . 'explode:' . PHP_EOL;
$parts = explode(' ', $string);
foreach ($parts as $part) {
var_dump($part);
}
// Wichtig · Fallstricke
Zustandsbehaftetes Verhalten: strtok() speichert den internen Zeiger global im PHP-Prozess. Das bedeutet: Wird innerhalb einer Schleife mit strtok() ein weiterer strtok()-Aufruf mit einem neuen String gestartet, wird der äußere Zeiger überschrieben. Verschachtelte Verwendung ist daher nicht sicher möglich.
Kein leeres Token: Mehrere aufeinanderfolgende Trennzeichen werden als eines behandelt. Wenn leere Felder erhalten bleiben müssen (z. B. beim echten CSV-Parsing), sollte stattdessen explode(), str_getcsv() oder preg_split() verwendet werden.
Thread-Safety: In Umgebungen mit nativen Threads (z. B. bestimmte SAPI-Konfigurationen) kann der globale Zustand von strtok() zu Race Conditions führen.