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|falseIl existe deux façons de l'appeler :
| Forme | Signification |
|---|---|
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 :
$delimiterest 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 queexplode(). - La fonction retourne
falselorsqu'il n'y a plus de tokens (ou si$delimiterest 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 argumentstrtok($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
youUtilisez 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
JohnRé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 linestrtok() vs explode()
Les deux divisent des chaînes, mais se comportent différemment :
strtok() | explode() | |
|---|---|---|
| Retourne | un token par appel | un tableau complet en une fois |
| Délimiteur | un ensemble de caractères simples | une chaîne multi-caractères fixe |
| Champs vides | ignorés | préservés |
| État | avec é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().