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 plus commune

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)

Mais on peut faire ça directement avec une autre méthode.

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.

Cet article t'a plu ? Si oui, je te propose de t'inscrire à ma dev letter pour recevoir régulièrement dans ta boîte mail mes conseils, mes nouveaux articles, des vidéos à voir, des outils à découvrir et encore bien d’autres choses.

Je m'inscris