[PHP] Remplacer des mots dans une string par des valeurs d'un tableau

Remplacer des mots dans une string par des valeurs d'un tableau [PHP] - PHP - Programmation

Marsh Posté le 23-10-2019 à 15:15:24    

Bonjour,
 
Voici le sujet:
- J'ai une variable $phrase qui contient par exemple ceci: "Bonjour %1, vous êtes %2."
- Un tableau $arr qui contient ceci: "['%1'=>'Charles', '%2'=>'grand']"
 
Je souhaiterais remplacer chaque occurence de %1 et %2 dans $phrase pour les valeurs correspondantes du tableau.
C'est possible avec un foreach(), mais je me dis qu'il existe peut-être mieux?
 
Par avance, merci!

Reply

Marsh Posté le 23-10-2019 à 15:15:24   

Reply

Marsh Posté le 23-10-2019 à 15:25:49    

Code :
  1. $t_replace = array(
  2.   '%1'=>'Charles',
  3.   '%2'=>'grand'
  4. );
  5. $string = "Bonjour %1, vous êtes %2.";
  6. echo str_replace(array_keys($t_replace), array_values($t_replace), $string);


https://www.php.net/manual/fr/function.str-replace.php
https://www.php.net/manual/fr/function.array-keys.php
https://www.php.net/manual/fr/function.array-values.php


---------------
D3
Reply

Marsh Posté le 23-10-2019 à 15:31:27    

Merci beaucoup, pour moi str_replace ne fonctionnait qu'avec des strings...

Reply

Marsh Posté le 23-10-2019 à 23:53:39    

Les fonctions de remplacement de chaînes acceptent généralement des tableaux de chaînes maintenant.
 
Avec str_replace il y a tout de même un potentiel problème : il faut s'assurer de remplacer, par exemple %10 avant %1 sinon le %10 va être substitué par la valeur de %1 avec un 0 derrière (et ainsi de suite avec toutes les dizaines, centaines et ainsi de suite)
 
A moins d'être sûr et certain de ne pas aller au-delà de %9.
 
J'aurais opté pour preg_replace_callback de façon à prendre le plus grand nombre possible via la gourmandise (par défaut) des motifs qui permet de s'affranchir de cet inconvénient :
 

Code :
  1. $string = "Bonjour %1, vous êtes %10.";
  2. $replacements = [
  3.  '%1'=>'Charles',
  4.  '%10'=>'grand',
  5. ];
  6.    '~%\d+~',
  7.    function ($m) use($replacements) {
  8.        return array_key_exists($m[0], $replacements) ? $replacements[$m[0]] : $m[0];
  9.    },
  10.    $string
  11. );
  12. echo str_replace(array_keys($replacements), array_values($replacements), $string);


 

Citation :

Bonjour Charles, vous êtes grand.
Bonjour Charles, vous êtes Charles0.


Message édité par pluj le 24-10-2019 à 00:03:29
Reply

Marsh Posté le 24-10-2019 à 09:34:57    

Certes, mais les performances ne seront pas les même avec des regex qu'avec des str_replace (qui doit être un genre de foreach + strpos optimisé).
Évidement il faudra qu'il fasse attention a ses clefs de remplacement, il peut aussi les doubler pour éviter tout conflit de ce genre (exemple:%01%)...
Personnellement je privilégie pour les clefs des caractères qu'on voit peu souvent genre des | ou §, y'a moins de risque de conflit.


---------------
D3
Reply

Marsh Posté le 24-10-2019 à 10:35:16    

Euh pourquoi ne pas passer par sprintf, à voir si la fonction accepte un tableau, sinon il suffit de décomposer le tableau.

 

EDIT : pour passer un tableau il faut utiliser la fonction vsprintf : https://www.php.net/manual/fr/function.vsprintf.php


Message édité par MaybeEijOrNot le 24-10-2019 à 10:37:09

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 28-10-2019 à 10:59:26    

MaybeEijOrNot> Avec vsprintf il faut que les arguments du tableau soient dans l'ordre de ceux à mettre dans la string.
C'est normalement le cas pour moi aussi mais pour le moment je ne vais utiliser le str_replace au cas où. Je garde cependant le vsprintf de côté.
 
Merci! :)

Reply

Marsh Posté le 28-10-2019 à 11:51:26    

Tu peux changer l'ordre en précisant dans la chaîne la position des arguments, regarde les exemples proposés pour sprintf. ;)


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 28-10-2019 à 16:07:04    

Pour sprintf oui mais pas pour vsprintf visiblement (j'ai pas encore trop pris le temps de regarder).
Enfin dans le pire des cas je peux toujours faire un implode de mon tableau et utilise sprintf. :)
 
Je vais passer un peu de temps ce soir pour regarder tout ça.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed