W3docs

strtok()

La fonction strtok() en PHP permet de découper une chaîne en parties plus petites appelées tokens, à l'aide d'un ou plusieurs délimiteurs.

Introduction

La fonction strtok() en PHP découpe une chaîne en morceaux plus petits appelés tokens. Un token est un fragment de texte situé entre des délimiteurs — des caractères simples tels qu'un espace, une virgule ou un retour à la ligne qui marquent où un morceau se termine et où le suivant commence.

Ce qui rend strtok() particulier, c'est qu'elle est avec état : elle mémorise sa position dans la chaîne entre les appels. Vous lisez le premier token, puis continuez à l'appeler pour extraire le suivant, et ainsi de suite, jusqu'à ce que la chaîne soit épuisée. Cette page couvre la syntaxe, le fonctionnement du pointeur interne, les pièges courants, et quand utiliser explode() à la place.

Syntaxe

strtok(string $string, string $delimiter): string|false
// continuation call:
strtok(string $delimiter): string|false

Il existe deux façons de l'appeler :

FormeSignification
strtok($string, $delimiter)Démarre la tokenisation de $string, retourne le premier token.
strtok($delimiter)Continue là où l'appel précédent s'est arrêté, retourne le token suivant.

Points clés concernant les paramètres :

  • $delimiter est un ensemble de caractères, pas un séparateur multi-caractères. " !?" signifie "diviser sur un espace, un point d'exclamation, ou un point d'interrogation" — chaque caractère est son propre délimiteur. Cela ne divise pas sur la chaîne littérale à trois caractères " !?".
  • Le délimiteur peut changer entre les appels, ce qui est la principale raison d'utiliser strtok() plutôt que explode().
  • La fonction retourne false lorsqu'il n'y a plus de tokens (ou si $delimiter est vide), elle peut donc être utilisée comme condition de boucle.

En PHP 8.1+, l'ancienne forme de continuation strtok(null, $delimiter) est dépréciée. Utilisez la forme à un seul argument strtok($delimiter) pour continuer.

Exemple de base : parcourir les tokens en boucle

Le schéma typique consiste en un appel pour démarrer, puis une boucle while qui extrait les tokens jusqu'à ce que strtok() retourne false :

<?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)
}

Résultat :

Hello
World
How
are
you

Utilisez une comparaison stricte !== false, pas seulement while ($token). Un token valant "0" est falsy en PHP, donc une vérification laxiste s'arrêterait prématurément sur des données légitimes.

Les délimiteurs consécutifs sont ignorés

Contrairement à explode(), strtok() traite une suite de caractères délimiteurs comme un seul séparateur et ne retourne jamais de tokens vides :

<?php

$tok = strtok("a,,b", ",");
while ($tok !== false) {
  echo "[$tok]\n";
  $tok = strtok(",");
}

Résultat :

[a]
[b]

Le morceau vide entre les deux virgules est silencieusement ignoré. explode(",", "a,,b") retournerait à la place ["a", "", "b"]. Si la préservation des champs vides est importante (CSV, par exemple), n'utilisez pas strtok().

Changer le délimiteur en cours d'analyse

Comme le pointeur interne est préservé, vous pouvez changer de délimiteur entre les appels — pratique pour analyser des données de type clé=valeur :

<?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";

Résultat :

name
John

Récupérer uniquement la première ligne

Une idiome rapide pour lire uniquement la première ligne d'une chaîne multi-lignes, sans construire un tableau de toutes les lignes :

<?php

$text = "first line\nsecond line\nthird line";

$firstLine = strtok($text, "\n");
echo $firstLine . "\n";

Résultat :

first line

strtok() vs explode()

Les deux divisent des chaînes, mais se comportent différemment :

strtok()explode()
Retourneun token par appelun tableau complet en une fois
Délimiteurun ensemble de caractères simplesune chaîne multi-caractères fixe
Champs videsignoréspréservés
Étatavec état (pointeur interne)sans état

Pour la plupart du code moderne, explode() est plus facile à raisonner et fonctionne bien avec les fonctions de tableau. Utilisez strtok() quand vous avez besoin d'une lecture paresseuse token par token ou souhaitez changer de délimiteur en cours de route. Pour des données séparées par des virgules avec des guillemets, préférez str_getcsv().

Pièges courants

  • Le pointeur interne est global par chaîne. Appeler une autre fonction qui utilise strtok() au milieu de votre boucle corrompra votre position. Terminez une tokenisation avant d'en commencer une autre.
  • Ne passez pas la chaîne source à nouveau lors d'une continuation. strtok($string, $delimiter) repart depuis le début à chaque fois. La continuation doit utiliser la forme à un seul argument.
  • Les champs vides disparaissent. Comme montré ci-dessus, strtok() ne peut pas vous indiquer qu'un champ était vide.

Conclusion

strtok() parcourt une chaîne un token à la fois, en divisant sur tout caractère d'un ensemble de délimiteurs et en conservant un pointeur interne entre les appels. Sa nature avec état la rend idéale pour l'analyse paresseuse et pour changer de délimiteurs en cours de traitement, tandis que sa tendance à supprimer les champs vides la rend peu adaptée aux données en colonnes fixes. Quand vous avez simplement besoin de tous les morceaux sous forme de tableau, explode() est généralement le choix le plus clair ; pour diviser en morceaux de longueur fixe, voir str_split().

Exercice

Pratique
Que fait la fonction PHP strtok ?
Que fait la fonction PHP strtok ?
Was this page helpful?