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

La fonction str_replace va remplacer toutes les occurrences d'une ou plusieurs chaînes par une autre.

  • Si vous voulez remplacer par exemple tous les _ par des - dans une chaîne.
$var = 'ma_chaine_a_modifier';
$var = str_replace('_', '-', $var);

// $var => 'ma-chaine-a-modifier'
  • Si vous souhaitez remplacer plusieurs chaînes par une autre :
$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'
  • On peut aussi supprimer des caractères en passant une chaîne vide comme caractère de substitution
$var = 'un seul grand mot, sans ponctuation.';
$var = str_replace([' ', ',', '.'], '', $var);

// $var => 'unseulgrandmotsansponctuation'
  • Et on peut remplacer des suites de chaines de caractères
$var = 'Bonjour John';
$var = str_replace('John', 'Jane', $var);

// $var => 'Bonjour Jane'

Une par "octet"

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 :

  • En utilisant les 3 arguments :
$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)

L'arrivée des regexp

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 😉)

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