Remplacer des caractères dans une chaîne
Il existe plusieurs manières de faire en PHP pour remplacer des caractères dans une chaîne. Nous allons en voir quelques-unes ici avec leurs spécificités.
La fonction str_replace
va remplacer toutes les occurrences d'une ou plusieurs chaînes par une autre.
_
par des -
dans une chaîne.$var = 'ma_chaine_a_modifier';
$var = str_replace('_', '-', $var);
// $var => 'ma-chaine-a-modifier'
$var = 'm4 ch4în3 b1z4rr3';
// ⛔️ je vois souvent :
$var = str_replace('1', 'i', $var);
$var = str_replace('3', 'e', $var);
$var = str_replace('4', 'a', $var);
// ✅ alors que str_replace peut faire le travail en une fois
$var = str_replace(['1', '3', '4'], ['i', 'e', 'a'], $var);
// ✅ et vous pouvez même faire un tableau de correspondance
$changes = [
'1' => 'i',
'3' => 'e',
'4' => 'a',
];
$var = str_replace(array_keys($changes), $changes, $var);
// $var => 'ma chaîne bizarre'
str_replace
remplace les caractères dans l'ordre du tableau. Il est donc possible avec str_replace
de faire des modifications successives.
Dans l'exemple suivant, on va commencer par remplacer les 0 par des 1 puis tous les 1 par des 2.
$var = '001122';
$var = str_replace(['0', '1'], ['1', '2'], $var);
// $var => '222222'
$var = 'un seul grand mot, sans ponctuation.';
$var = str_replace([' ', ',', '.'], '', $var);
// $var => 'unseulgrandmotsansponctuation'
$var = 'Bonjour John';
$var = str_replace('John', 'Jane', $var);
// $var => 'Bonjour Jane'
Un peu moins connu, la fonction strtr
remplace chaque caractère de un octet par un caractère de substitution. (vous remarquerez l'ordre différent des arguments)
$var = 'ma_chaine_a_modifier';
$var = strtr($var, '_', '-');
// $var => 'ma-chaine-a-modifier'
Tout comme str_replace
, strtr
peut effectuer plusieurs remplacements en même temps, de deux manières différentes :
$var = 'm4 ch4în3 b1z4rr3';
$var = strtr($var, '134', 'iea');
// $var => 'ma chaîne bizarre'
Il va ici prendre chaque caractère les uns après les autres et les remplacer par leur correspondance. On ne peut donc pas de cette manière remplacer un mot par un autre, ça ne sera que caractère par caractère. Si on veut pouvoir remplacer des chaînes de plus de 1 caractère, il faut passer par un tableau associatif :
$var = 'm4 ch4în3 b1z4rr3';
$changes = [
'1' => 'i',
'3' => 'e',
'4' => 'a',
];
$var = strtr($var, $changes);
// $var => 'ma chaîne bizarre'
$var = 'Bonjour John';
$changes = [
'Bonjour' => 'Au revoir',
'John' => 'Jane',
];
$var = strtr($var, $changes);
// $var => 'Au revoir Jane'
Par contre, contrairement à str_replace
, strtr
ne remplacera pas un caractère précédemment remplacé.
$var = '001122';
$changes = [
'0' => '1',
'1' => '2',
];
$var = strtr($var, $changes);
// $var => '112222' (et non pas 222222 comme avec str_replace)
Il est aussi possible de modifier les caractères d'une chaîne en utilisant les regexp via preg_replace
.
Cette méthode fonctionne à peu près comme str_replace
sauf qu'elle prend un masque comme chaîne de recherche
$var = 'ma_chaine_a_modifier';
$pattern = '/([a-z]+)/';
$var = preg_replace($pattern, 'mot', $var);
// $var => 'mot_mot_mot_mot'
Je ne vais pas trop rentrer dans les détails, si vous êtes à l'aise avec les regexp, je vous invite à aller consulter la documentation officielle sur cette méthode.
J'espère ne pas vous avoir donné trop mal à la tête avec tous ces exemples. Maintenant à vous de voir de quoi vous avez besoin ! (en tout cas, recherchez dans votre base de code, vous avez surement des endroits où vous faites plusieurs str_replace
alors que vous pourriez n'en faire qu'un 😉)
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.