sscanf()
Notre article présente la fonction PHP sscanf(), utilisée pour analyser une entrée à partir d'une chaîne selon un format donné.
La fonction PHP sscanf() lit une chaîne et en extrait des valeurs selon un format que vous décrivez — c'est l'inverse de sprintf(). Là où sprintf() construit une chaîne formatée à partir de variables, sscanf() décompose une chaîne formatée en variables. Elle excelle lorsque vous disposez d'un texte de forme prévisible (dates, coordonnées, lignes de journal, codes d'identification) et souhaitez obtenir des éléments propres et typés sans écrire d'expression régulière.
Ce chapitre couvre la syntaxe, les deux façons de récupérer les résultats, les spécificateurs de format que vous utiliserez réellement, et les pièges courants.
Syntaxe
sscanf(string $string, string $format, mixed &...$vars): array|int|null$string— le texte d'entrée à analyser.$format— un modèle décrivant ce qu'il faut lire, à l'aide de spécificateurs%(la même famille que celle utilisée parprintf).&...$vars— des variables optionnelles, passées par référence, qui reçoivent les valeurs analysées.
Le comportement de sscanf() dépend de si vous passez ces variables supplémentaires :
| Style d'appel | Valeur de retour |
|---|---|
Seulement $string et $format | Un tableau des valeurs analysées |
Avec des variables par référence après $format | Un int : le nombre de valeurs assignées avec succès |
Retourner les valeurs sous forme de tableau
Si vous omettez les arguments par référence, sscanf() retourne tout sous forme de tableau. C'est le style le plus propre en PHP moderne et évite de passer des variables par référence.
%s lit le prochain mot sans espace (John), et %d lit un entier (25, stocké comme un vrai int, et non la chaîne "25"). Le résultat est :
John
25Assigner directement dans des variables
Passer des variables après le format les assigne directement. Dans ce mode, la valeur de retour est le nombre de champs qui ont correspondu, ce qui est utile pour valider les entrées.
<?php
$input = 'John 25';
$matched = sscanf($input, '%s %d', $name, $age);
echo $matched . "\n"; // 2 (both fields were read)
echo $name . "\n"; // John
echo $age; // 25
?>Remarque : en PHP 8, le préfixe
&à l'appel (par ex.sscanf($s, $f, &$name)) a été supprimé. Passez simplement la variable brute —sscanf()déclare lui-même ces paramètres comme passés par référence.
Spécificateurs de format courants
| Spécificateur | Lit |
|---|---|
%s | Une chaîne jusqu'au prochain espace |
%d | Un entier décimal signé |
%f | Un nombre à virgule flottante |
%x | Un entier hexadécimal |
%c | Un seul caractère |
%% | Un signe % littéral |
Les caractères littéraux dans le format (espaces, barres obliques, deux-points) doivent également apparaître dans l'entrée. Cela rend sscanf() excellent pour des données de forme fixe comme les dates :
<?php
$date = '2026-06-21';
[$year, $month, $day] = sscanf($date, '%d-%d-%d');
printf("Year=%d Month=%d Day=%d", $year, $month, $day);
// Year=2026 Month=6 Day=21
?>Quand utiliser sscanf() plutôt que les alternatives
- Utilisez
sscanf()lorsque le format est fixe et simple et que vous souhaitez des résultats typés en une ligne. - Utilisez
explode()lorsque vous avez seulement besoin de diviser sur un délimiteur et de conserver tout sous forme de chaînes. - Utilisez
preg_match()lorsque la structure est irrégulière ou nécessite des règles de validation allant au-delà des types de champs simples. - Pour l'opération inverse — assembler une chaîne formatée — utilisez
sprintf()ouprintf().
Pour lire une entrée formatée directement depuis un fichier plutôt que depuis une chaîne, voir fscanf(), qui fonctionne de la même façon ligne par ligne.
Pièges courants
%ss'arrête aux espaces. Il ne capturera pas une valeur composée de plusieurs mots. Pour lire le reste d'une ligne, utilisez un ensemble de scan comme%[^\n].- Un champ non correspondant interrompt le reste. Si
%dest attendu mais que l'entrée contient des lettres, l'analyse s'arrête ; la valeur de retour de comptage vous permet de détecter cela. - Les variables non correspondantes restantes deviennent
null. Vérifiez toujours le comptage retourné avant de faire confiance aux variables suivantes.