Bienvenue sur les forums conseil & création · S'enregistrer

Se connecter automatiquement

Forums » PHP & MySQL » Petit probleme avec eregi_replace · Envoyer le lien

Par Lauweb, le 26 Juin 2005, 12:40 Revenir en haut de page Répondre en citant

Salut

je n'arrive pas à comprendre pourquoi ce petit bout de code ne fonctionne pas:
Code:

$Chaine1="VAR1=aaaa&VAR2=bbbb&VAR3=cccc&VAR4=dddd&VAR5=eeee&VAR6=ffff&VAR7=gggg";
$Chaine2=eregi_replace("&VAR3=.*&VAR4=.*&","&VAR3=12345&VAR4=678910&",$Chaine1);
echo"$Chaine2";

Cela me renvoie:
Code:

VAR1=aaaa&VAR2=bbbb&VAR3=12345&VAR4=678910&VAR7=gggg

Alors que j'aimerais obtenir:
Code:

VAR1=aaaa&VAR2=bbbb&VAR3=12345&VAR4=678910&VAR5=eeee&VAR6=ffff&VAR7=gggg


Certainement une nuance dans l'écriture de la règle...

Merci de vos suggestions...
Par Cédric, le 26 Juin 2005, 13:45 Revenir en haut de page Répondre en citant

Salut,

C'est parce que dans : &VAR3=.*&VAR4=.*&, il retourne la dernière occurence de .*&.
Ca fonctionne si tu utilises: &VAR3=.*&VAR4=.*&VAR5, puisqu'il n'y a qu'un seul &VAR5 dans la chaîne.
Arrow il faudrait sans doute modifier le pattern pour qu'il remplace uniquement "cccc" et "dddd".

Mais il vaut mieux utiliser str_replace (plus rapide)
... il est conseillé de n'utiliser ereg_replace que pour les règles de remplacement compliquées. Ici ce n'est pas compliqué puisque tu connais exactement les chaînes à remplacer.

Code:
$chaine = "VAR1=aaaa&VAR2=bbbb&VAR3=cccc&VAR4=dddd&VAR5=eeee&VAR6=ffff&VAR7=gggg";
$original = Array ("cccc", "dddd");
$replace = Array ("12345", "678910");
$chaine = str_replace($original, $replace, $chaine);
echo $chaine;
Par Lauweb, le 26 Juin 2005, 18:05 Revenir en haut de page Répondre en citant

Merci Cédric pour ta réponse.

Citation:
Ca fonctionne si tu utilises: &VAR3=.*&VAR4=.*&VAR5, puisqu'il n'y a qu'un seul &VAR5 dans la chaîne

C'est justement ce que je ne veux pas faire car je ne connais pas forcement le nom de la variable suivante. Ici c'est VAR5 mais ça pourait être n'importe quoi d'autre.

Citation:
Ici ce n'est pas compliqué puisque tu connais exactement les chaînes à remplacer.

En effet dans cet exemple c'est plutôt simple, mais le truc c'est que VAR3 et VAR4 peuvent changer de valeurs, d'ou l'utilisation des .* . J'aurais du le préciser...
En clair j'aimerais changer les valeurs de n'importe quelle variable dans une url.
Par Cédric, le 27 Juin 2005, 10:12 Revenir en haut de page Répondre en citant

Ok dans ce cas, il faut que tu utilises .[^&]* (cherche tous les caractères en excluant "&").

Code:
$Chaine2=eregi_replace("&VAR2=.[^&]*(.*)&VAR4=.[^&]*","&VAR2=12345\\1&VAR4=678910",$Chaine1);


Donc c'est en principe ce que tu cherchais, mais si une variable n'existe pas... rien ne sera remplacé ! C'est peut-être ce que tu cherches, sinon il faudrait faire plus "complet" :

Code:
$Chaine1="VAR1=aaaa&VAR2=bbbb&VAR3=cccc&VAR4=dddd&VAR5=eeee&VAR6=ffff&VAR7=gggg";
$ajouter = ""; $pattern=""; $replacement=""; $bcl=0;

$replace = Array (
   "VAR2" => "12345",
   "VAR4" => "678910",
   "VAR8" => "111213"
   );

foreach ($replace as $key=>$value) {
   $pos = strpos($Chaine1, "&$key=");
   if ( $pos === false) { $ajouter .= "&$key=$value"; }
      else { $bcl = $bcl+1;
      $pattern .= "&". $key . "=[^&]*(.*)";
      $replacement .= "&".$key."=".$value."\\$bcl";
      }
}

$Chaine2 = eregi_replace($pattern,$replacement,$Chaine1).$ajouter;
echo"$Chaine2";


  • mets dans $replace la liste des variables à remplacer. Si une variable n'existe pas dans $Chaine1, elle sera ajoutée.
  • la boucle foreach vérifie si chaque variable ($key) est dans $Chaine1... si elle y est, on l'ajoute au pattern (=> on remplace) et si elle n'y est pas, on la place dans $ajouter
Par Lauweb, le 30 Juin 2005, 11:06 Revenir en haut de page Répondre en citant

En effet .[^&]* est ce qui me fallait

Code:

     function Tri()
     {
       global $url;
       $url2=eregi_replace("&VAR3=.*&VAR4=.[^&]*","",$url);
       
       return $url2;   
     }


... Mais je garde dans un coin ton bout de code qui m'a l'air plutôt efficace.

Merci
A+
Par Cédric, le 30 Juin 2005, 11:23 Revenir en haut de page Répondre en citant

Ok donc tes variables sont forcément l'une après l'autre (VAR3 et VAR4) ? Parce que là dans ton pattern, il ne pourra y avoir aucune autre variable entre les deux (et comme tu dis que tu ne connais pas forcément le nom de toutes les variables) ?!

Et apparemment, c'est pour supprimer VAR3 et VAR4 ?! Si c'est le cas, str_replace peut quand même fonctionner (et d'après php.net, cette fonction est préférable à eregi_replace).

@+, Cédric
Par Lauweb, le 30 Juin 2005, 11:45 Revenir en haut de page Répondre en citant

Oui ces 2 variables se suivent toujours,
Effectivement, dans cette petite fonction les variables sont supprimées.

Quand je veux changer de valeurs j'utilise ça:
Citation:

$url=$REQUEST_URI;
$vardepart = Array ($VAR3, $VAR4);
$vararrivee = Array ($AUTREVALEUR1, $AUTREVALEUR2);
$url2 = str_replace($vardepart, $vararrivee, $url);

Forums » PHP & MySQL » Petit probleme avec eregi_replace · Envoyer le lien