Affichages avec masques en PHP
En PHP, il est possible d’afficher ou de retourner du contenu et le formater en même temps. Par exemple on peut vouloir afficher le début d’une chaîne et cacher le reste avec des astérix (comme pour les numéros de transaction) HT********. Cela s’avère très pratique puisque qu’on évite la concaténation.
La fonction printf() permet d’afficher directement la chaîne formatée tandis que la fonction sprintf()permet de retourner une chaîne formatée (qui sera stockée en mémoire dans une variable).
Voici un exemple concrêt :
<?php
$recup = sprintf("%'*12s",'AB');
?>
Affichage
**********AB
Le premier paramètre de la fonction sprintf() représente le format, le deuxième paramètre est l’argument. Ici l’argument est la chaine AB.
Pour constituer une spécification de format, on commence par utiliser le caractère pourcentage % et on finit par un spécificateur de type qui correspond au type de valeur utiliser dans l’argument. Dans notre cas le spécificateur s signifie string.
% s
Le nombre 12 permet d’indiquer la taille minimum de l’argument : %12s signifie que la taille minimum de l’argument est de 12 caractères. Par défaut, le remplissage se fait avec des espaces.
%12s
Vous pouvez utiliser un remplisseur optionnel qui indique quel caractère sera utilisé pour compléter le résultat. Un autre caractère de remplissage peut être spécifié en le préfixant avec un guillemet simple (‘). Dans notre cas on utilise l’astérix ‘*’
%'*12s
Le format permet donc de remplir l’argument de type string avec des astérix jusqu’à 12 caractères : %’*12s
Vous pouvez utiliser aussi un spécificateur d’alignement qui indique si le résultat doit être aligné à gauche ou à droite. Par défaut, le résultat est aligné à droite. Le caractère moin – fera que le résultat sera justifié à gauche.
<?php
$recup = sprintf("%'*-12s",'AB');
?>
Affichage
AB**********
Échange d’arguments
Vous pouvez créer un format avec plusieurs spécifications, ce qui nécessitera plusieurs arguments.
<?php
$format = "Le prix du produit %s est de %d euros"; // format
$prix = 72; // argument pour la spécification du prix %d
$produit = "parfum"; // argument pour la spécification du produit %s
$recup = sprintf($format,$produit,$prix);
echo $recup;
?>
Affichage
Le prix du produit parfum est de 72 euros
Dans cet exemple, l’ordre des arguments est important par rapport au format, l’argument $produit doit précédé l’argument $prix. L’avantage de l’échange d’arguments est la réutilisation du même format mais avec des arguments qui peuvent être fournis dynamiquement.
<?php
$format = "Le prix du produit %s est de %d euros"; // format
$prix = 72; // argument pour la spécification du prix %d
$produit = "parfum"; // argument pour la spécification du produit %s
$recup = sprintf($format,$produit,$prix);
echo $recup;
$prix = 112;
$produit = "canapé";
$recup = sprintf($format,$produit,$prix);
echo $recup;
?>
Affichage
Le prix du produit parfum est de 72 euros
Le prix du produit canapé est de 112 euros
Modifier l’ordre des spécifications
Vous pouvez indiquer dans la chaîne de formatage l’ordre dans lequel les arguments doivent être utilisés en utilisant le spécificateur de position n$ pour chaque spécification. Le spécificateur de position n$ doit survenir immédiatement après le signe de pourcentage(%), avant tout autre spécificateur.
<?php
$format = ' %2$d euros est le prix du produit %1$s '; // format
$prix = 72; // argument pour la spécification du prix %d
$produit = "parfum"; // argument pour la spécification du produit %s
$recup = sprintf($format,$produit,$prix);
echo $recup;
?>
Affichage
72 euros est le prix du produit parfum
Dans cet exemple le traitement d’affichage de PHP (lignes de codes de 3 à 6) est resté intact.
Note : n’utiliser pas les guillemets » » mais les apostrophes ‘ ‘ pour délimiter la chaîne de format car le caractère $ risque d’être interprété comme une déclaration de variable.
Exploiter plusieurs fois les arguments
Si vous n’utilisez pas le spécificateur de position, vous serez obligé de répéter les arguments pour les utiliser plusieurs fois.
<?php
$format = "produit %s prix %d euros, produit %s prix %d euros "; // format
$prix = 72; // argument pour la spécification du prix %d
$produit = "parfum"; // argument pour la spécification du produit %s
$recup = sprintf($format,$produit,$prix,$produit,$prix);
echo $recup;
?>
Affichage
produit parfum prix 72 euros, produit parfum prix 72 euros
Les arguments sont répétés dans la fonctions sprintf() et dans l’ordre d’utilisation des spécifications.
Pour palier à cet inconvénient, vous pouvez recourir à nouveau aux spécificateurs de position.
<?php
$format = ' produit %1$s prix %2$d euros, produit %1$s prix %2$d euros '; // format
$prix = 72; // argument pour la spécification du prix %d
$produit = "parfum"; // argument pour la spécification du produit %s
$recup = sprintf($format,$produit,$prix);
echo $recup;
?>
Affichage
produit parfum prix 72 euros, produit parfum prix 72 euros
Vous remarquez que les arguments n’ont pas été répétés dans la fonction sprintf().
Passer plusieurs paramètres
Si vous devez faire passer un nombre important de paramètres à la fonction sprintf(), vous pouvez utiliser un tableau les contenant tous. Dans ce cas utilisez la fonction vprintf() ou vsprintf() qui sont similaires. La fonction vprintf() affiche directement le résultat tandis que vsprintf() retourne le résultat dans une variable.
<?php
$tab = array("HTML",5);
vprintf('%s %d-',$tab); // affiche directement HTML 5-
$recup = vsprintf('%s %d',$tab); // met le résultat en variable
echo $recup; // affiche la variable
?>
Affichage
HTML 5-HTML 5
Scanner une chaîne
Vous pouvez faire l’opération inverse et parcourir une chaîne pour récupérer les valeurs selon un masque défini. S’il existe plusieurs valeurs , un tableau sera retourné. Utilisez pour cela la fonction sscanf(). Si aucune valeur est trouvée, la valeur false sera retournée.
<?php
$chaine = "3 est un nombre";
$tab = sscanf($texte,'%d%s%d %s %d');
print_r($tab); // affiche la structure du tableau
?>
Affichage
Array ( [0] => 3 [1] => est [2] => un [3] => nombre )
Le deuxième paramètre de la fonction est le masque. Vous pouvez aussi lire le contenu d’un fichier avec la fonction fscanf() pour en extraire les valeurs.