logo oujood
🔍

Fonction sscanf() de PHP : Analyse et extraction de données par format

Guide technique complet sur sscanf() : syntaxe, spécificateurs de format, modes de retour (tableau ou variables) et exemples pratiques commentés.

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.

Syntaxe
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 :

  • %% — Correspond à un signe pourcentage littéral
  • %b — Nombre en base binaire
  • %c — Caractère ASCII correspondant à la valeur numérique
  • %d — Nombre décimal entier signé
  • %e — Notation scientifique (ex. : 1.2e+2)
  • %u — Nombre décimal entier non signé
  • %f — Nombre à virgule flottante (dépendant de la locale)
  • %F — Nombre à virgule flottante (indépendant de la locale)
  • %o — Nombre en base octale
  • %s — Chaîne de caractères (s'arrête à l'espace suivant)
  • %x — Nombre hexadécimal (lettres minuscules)
  • %X — Nombre hexadécimal (lettres majuscules)

Modificateurs optionnels placés entre % et la lettre de type (ex. : %.2f) :

  • + — Force l'affichage du signe + ou – devant les nombres
  • ' — Définit le caractère de remplissage (défaut : espace). Exemple : %'x20s utilise « x » comme remplissage
  • - — Justifie la valeur à gauche dans le champ
  • [0-9] — Largeur minimale du champ
  • .[0-9] — Précision décimale ou longueur maximale de chaîne

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.

  📋 Copier le code

<?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.

  📋 Copier le code

<?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 : 3

Exemple 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.

  📋 Copier le code

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

Par carabde | Mis à jour le 17 février 2026