| Par Lauweb, le 26 Juin 2005, 12:40 |
Revenir en haut de page |
|
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 |
|
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.
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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);
|
|
|
 |