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 3Voici 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.
J’ai préparé un guide pratique avec une dizaine de conseils essentiels pour poser de bonnes bases.
👉 Bonnes pratiques, astuces spécifiques à PHP, exemples concrets… tout y est pour prendre de suite les bonnes habitudes.