OUJOOD.COM
La fonction sscanf() en PHP : analyse de chaînes par format
PHP – Référence des fonctions de chaînes de caractères(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
sscanf() — Analyse et décompose une chaîne de caractères selon un format spécifié, à la manière d'un analyseur lexical simplifié.
Définition et utilisation
La fonction sscanf() de PHP est un outil puissant pour extraire et analyser des données structurées depuis une chaîne de texte. Elle fonctionne comme l'inverse de sprintf() : là où sprintf() formate des variables en une chaîne, sscanf() décompose une chaîne en variables typées selon un masque de format. C'est la solution idéale pour le parsing de chaînes à format fixe tels que des numéros de série, des dates formatées, des codes produits ou des lignes de journaux système.
Deux modes de fonctionnement distincts sont disponibles selon le nombre de paramètres fournis :
- Mode tableau (2 paramètres) : si seuls la chaîne et le format sont passés,
sscanf()retourne un tableau indexé contenant les valeurs extraites. - Mode variables (3+ paramètres) : si des variables sont passées en références supplémentaires, les données analysées y sont stockées directement et la fonction retourne le nombre de valeurs assignées.
Gestion des erreurs de correspondance : si le nombre de spécificateurs de format dépasse le nombre de variables fournies, une erreur est générée. À l'inverse, si des variables supplémentaires existent sans spécificateur correspondant, elles reçoivent la valeur NULL.
sscanf(string $str, string $format, mixed &...$vars): array|int|null
| Paramètre | Description |
|---|---|
chaîne |
Requis. La chaîne source à analyser et décomposer. |
format |
Requis. Le masque de format définissant la structure attendue. Spécificateurs de type disponibles :
Modificateurs optionnels placés entre
Note : Les modificateurs multiples doivent respecter l'ordre ci-dessus. |
arg1 |
Facultatif. Première variable (passée par référence) pour stocker la première valeur extraite. |
arg2 |
Facultatif. Deuxième variable de réception. |
arg++ |
Facultatif. Troisième, quatrième variable, etc., pour stocker les valeurs extraites supplémentaires. |
Exemples pratiques de sscanf()
Les exemples suivants illustrent les deux modes d'utilisation de sscanf() en PHP : extraction vers un tableau et extraction directe dans des variables typées.
Exemple 1 — Extraction d'un numéro de série et d'une date de fabrication (mode tableau)
Cet exemple montre comment utiliser sscanf() en mode retour tableau avec list() pour extraire simultanément un identifiant numérique et une date structurée depuis des chaînes formatées. C'est un cas d'usage typique pour le parsing de codes produit et de données temporelles.
<?php // --- Exemple 1 : Mode tableau avec list() --- // sscanf() retourne un tableau quand aucune variable n'est passée en 3e param. // On utilise list() pour déstructurer directement le tableau retourné. // Extraction du numéro de série depuis une chaîne préfixée "SN/" // Le spécificateur %d extrait uniquement la partie entière après "SN/" list($serial) = sscanf("SN/2350001", "SN/%d"); // Chaîne de date à analyser : format "Mois Jour Année" $mandate = "January 01 2000"; // %s capture "January" (s'arrête à l'espace), %d capture 01 puis 2000 list($month, $day, $year) = sscanf($mandate, "%s %d %d"); // Affichage formaté : substr() tronque le nom du mois à 3 caractères (Jan) echo "Le produit $serial a été fabriqué le : $day-" . substr($month, 0, 3) . "-$year\n"; ?>
Résultat :
Le produit 2350001 a été fabriqué le : 1-Jan-2000
Exemple 2 — Parsing de données tabulées vers un format XML DocBook (mode variables)
Cet exemple illustre le mode variables de sscanf() : les données extraites sont stockées directement dans des variables passées par référence. Idéal pour transformer des données délimitées par tabulation (TSV) en structures XML ou HTML dynamiques.
<?php // --- Exemple 2 : Mode variables (passage par référence) --- // sscanf() avec 3+ arguments stocke les valeurs dans les variables // et retourne le nombre de valeurs assignées avec succès. // Chaîne source : identifiant numérique + tabulation + prénom + nom // Le "\t" dans le format correspond au caractère tabulation réel $auth = "24\tLewis Carroll"; // %d capture l'entier 24 dans $id // \t correspond à la tabulation dans la chaîne source // %s capture "Lewis" dans $first (s'arrête à l'espace) // %s capture "Carroll" dans $last (jusqu'à la fin de la chaîne) // $n reçoit le nombre de valeurs extraites (ici : 3) $n = sscanf($auth, "%d\t%s %s", $id, $first, $last); // Génération d'une balise XML DocBook structurée à partir des données extraites echo "<author id='$id'>\n"; echo " <firstname>$first</firstname>\n"; echo " <surname>$last</surname>\n"; echo "</author>\n"; // Vérification : affiche le nombre de champs analysés echo "Nombre de champs extraits : $n\n"; ?>
Code source généré :
<author id='24'>
<firstname>Lewis</firstname>
<surname>Carroll</surname>
</author>
Nombre de champs extraits : 3Exemple 3 — Validation et extraction de données IP et port (PHP 8 compatible)
Cas d'usage avancé : parsing d'une adresse IP avec port depuis une chaîne de configuration réseau. Démontre la combinaison de spécificateurs %d multiples pour extraire des segments entiers séparés par des délimiteurs non-espace.
<?php // --- Exemple 3 : Extraction d'une adresse IPv4 et d'un port réseau --- // sscanf() avec %d et des délimiteurs littéraux (les points et les deux-points) // permet de décomposer une adresse IP sans recourir à explode() ou preg_match(). $connexion = "192.168.1.100:8080"; // Chaque %d capture un segment entier ; les points et ":" sont des délimiteurs littéraux // $port capturera le numéro de port après les deux-points $n = sscanf($connexion, "%d.%d.%d.%d:%d", $oct1, $oct2, $oct3, $oct4, $port); if ($n === 5) { // Reconstitution de l'IP pour validation et affichage structuré $ip = "$oct1.$oct2.$oct3.$oct4"; echo "Adresse IP : $ip\n"; echo "Port : $port\n"; echo "Classe IP : " . ($oct1 < 128 ? "A" : ($oct1 < 192 ? "B" : "C")) . "\n"; } else { echo "Format d'adresse invalide ($n champs reconnus sur 5 attendus)\n"; } ?>
Résultat :
Adresse IP : 192.168.1.100 Port : 8080 Classe IP : C
Fonction précédente : |
Fonction suivante : |
Par carabde | Mis à jour le 17 février 2026