Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1211 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2340546
Furaxx
Posté le 23-10-2019 à 15:15:24  profilanswer
 

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!

mood
Publicité
Posté le 23-10-2019 à 15:15:24  profilanswer
 

n°2340547
mechkurt
Posté le 23-10-2019 à 15:25:49  profilanswer
 

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
n°2340548
Furaxx
Posté le 23-10-2019 à 15:31:27  profilanswer
 

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

n°2340569
pluj
Posté le 23-10-2019 à 23:53:39  profilanswer
 

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
n°2340577
mechkurt
Posté le 24-10-2019 à 09:34:57  profilanswer
 

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
n°2340582
MaybeEijOr​Not
but someone at least
Posté le 24-10-2019 à 10:35:16  profilanswer
 

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.
n°2340674
Furaxx
Posté le 28-10-2019 à 10:59:26  profilanswer
 

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! :)

n°2340676
MaybeEijOr​Not
but someone at least
Posté le 28-10-2019 à 11:51:26  profilanswer
 

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.
n°2340691
Furaxx
Posté le 28-10-2019 à 16:07:04  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
[PHP] Obtenir l'URL précédente[PHP] Systme d'alerte
Exercice de tableau basique en C URGENT !résolu
Problème d'alloc mémoire avec PHP et lib GD pour générer des imagesPHP/Ruby
tableau de présence avec compteur[PHP] Garder uniquement les enregistrements présents dans un tableau
string literal contains an unescaped line break 
Plus de sujets relatifs à : [PHP] Remplacer des mots dans une string par des valeurs d'un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR