Parser une chaîne de caractère
Si vous êtes comme moi un habitué de kata, il est souvent demandé de parser des chaînes de caractères.
Par exemple, dans l'advent of code 2021, un exercice demandait de parser un ensemble d'instructions de type :
forward 5
down 5
up 3
Voici donc quelques manières de parser ces instructions.
La manière qui m'est venue le plus rapidement à l'esprit est d'utiliser la méthode explode
:
$var = 'forward 5';
$instructions = explode(' ', $var);
/*
array (
0 => 'forward',
1 => '5',
)
*/
$direction = $instructions[0];
$distance = $instructions[1];
On peut simplifier en utilisant list
.
$var = 'forward 5';
list($direction, $distance) = explode(' ', $var);
/*
$direction => string(7) "forward"
$distance => string(1) "5"
*/
C'est plutôt pas mal et assez simple ? Mais une petite chose me dérange : la distance est stockée comme une chaîne de caractères. Il faudrait plutôt que cela soit un int
. Il faudrait donc rajouter :
$distance = (int) $distance;
// int(5)
Pour parser plus finement des chaînes de caractères dont vous connaissez le format global (comme ici avec nos instructions), pas besoin de sortir tout de suite l'artillerie lourde avec les regexp
, vous pouvez utiliser la méthode sscanf
en lui passant la chaîne à traiter ainsi que son format :
$var = 'forward 5';
list($direction, $distance) = sscanf($var, '%s %d');
/*
$direction => string(7) "forward"
$distance => int(5)
*/
Ici, on s'attend à avoir une chaîne de caractère (%s
) suivi d'un espace et d'un entier (%d
).
Et on voit bien que $distance
est directement converti en entier ! Exactement ce que l'on voulait !
La liste des spécificateurs de format est fournie sur le site officiel de PHP sur la page de la fonction printf
.
Mon programme "S'entraîner pour progresser en PHP" est disponible. Il vous permettra de recevoir chaque semaine un kata de code directement dans votre boîte mail, ainsi que des aides à la réalisation, des vidéos explicatives et des défis supplémentaires.