Version complète: sur le forum Webmaster Hub : Expressions régulières en PHP
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
petit-ourson
Bon j'ai un petit soucis et là je sèche (je sèche souvent avec les expressions régulières ...).

On va dire que j'ai 4 chaines possibles ($chaine) :

toto=1234
toto=1234&tutu=1234&tata=1234&titi=1234
tata=1234&tutu=1234&toto=1234&titi=1234
tata=1234&tutu=1234&titi=1234&toto=1234

Je veux pouvoir utiliser la fonction preg_match pour supprimer les éléments en rouge.

Le problème, c'est que je ne trouve pas le bon modèle ($motif). J'ai pas trouvé mieux que cela :

CODE
$motif = "`^(.*)(toto=1234)[&]?(.*)$`";
preg_match($motif,$chaine,$out);
echo $out[1].$out[3];


et j'obtiens comme résultat pour chacune des chaines :

(vide)
tata=1234&titi=1234&tutu=1234
tata=1234&titi=1234&tutu=1234&toto=1234
tata=1234&titi=1234&tutu=1234&

Donc il y a un '&' en trop pour le 4e cas sad.gif

(Je ne cherche pas une autre technique, mais une réponse à ce problème.)
TheRec
Bonjour,

Il me semble que tes exemples ne reflètent pas réellement ce que ton code retourne... mais je me trompe peut-être, enfin je vais me baser sur la description que tu as faite plutôt que sur les résultats de tex exemples.

À défaut de te proposer un seul motif (et je pense que réaliser cela en une seule expression deviendrait trop complexe : assertions, sous masques conditionnels, etc.), voici comme tu peux le faire :
CODE
  $chaines = array('toto=1234',
                   'toto=1234&tutu=1234&tata=1234&titi=1234',
                   'tata=1234&tutu=1234&toto=1234&titi=1234',
                   'tata=1234&tutu=1234&titi=1234&toto=1234');

  $motif =   array("/^toto=1234&?/", // 1. Lorsque le paramètre est en première position (précédé ou non d'un &)
                   "/&?toto=1234$/", // 2. Lorsque le paramètre est en dernière position (précédé ou non d'un &)
                   "/&toto=1234&/"); // 3. Lorsque le paramètre est au milieu d'autres (donc entourée de &)

  $replace = array('',   // 1.
                   '',   // 2.
                   '&'); // 3.

  foreach($chaines as $chaine) {  
    echo preg_replace($motif,$replace,$chaine)."\n";
  }

Mais franchement je ne vois pas pourquoi tu n'utilises tout simplement pas la fonction split sur le caractère "&" et ensuite parcourir le tableau en vérifiant si la valeur de la cellule courrant est celle dont tu veux te débarrasser (toto=1234) et l'enlever (avec unset) puis de reformer ta chaîne grâce à la fonction join.

Enfin procède comme tu veux, je ne connais pas toutes les contraintes de ton projet wink.gif

Bonne continuation.
petit-ourson
C'est devenu une contrainte de connaissances ;o)

Avec le split c'est oui plus rapide mais ça ne me dit pas pourquoi je n'arrive pas à le faire.

Donc là c'est plus pour ma culture ;o)
TheRec
Je ne suis pas certain d'avoir compris ce que tu veux dire dans ta dernière réponse :S
Enfin, si tu me demande comment le faire avec la fonction split, pas de problème.
Je n'ai pas mis ce code parce que tu semblais ne pas vouloir d'autres solutions que les expressions rationnelles (pour te citer, (Je ne cherche pas une autre technique, mais une réponse à ce problème.)) :
CODE
  $chaines = array('toto=1234',
                   'toto=1234&tutu=1234&tata=1234&titi=1234',
                   'tata=1234&tutu=1234&toto=1234&titi=1234',
                   'tata=1234&tutu=1234&titi=1234&toto=1234');

  foreach($chaines as $chaine) {  
    $params = split("&",$chaine);
    foreach($params as $key => $val) {
      if($val == 'toto=1234') {
        unset($params[$key]);
        // On pourrait éventuellement sortir de la boucle ici,
        // si on considère que ce paramètre ne "devrait" apparaître qu'une seule fois
      }
    }
    echo join("&",$params)."\n";
  }

Si ce n'est pas ce que tu voulais dire, pardon... enfin ça servira peut-être à quelqu'un d'autre, un jour wink.gif
petit-ourson
Oui, je me suis mal exprimé.

La réponse au problème, je l'avais en passant entre autre par la fonction split.

Je cherche juste la réponse à mon problème en passant pas les expressions régulières pour ma culture ;o)

Je vais essayé de comprendre le système d'assertions !
TheRec
D'accord, si tu arrives à une solution avec un seul motif je serais intéressé de la connaître, donc n'hésite pas à la poster smile.gif
Jeanluc
CITATION(TheRec @ jeudi 8 mars 2007, 23h09) *
D'accord, si tu arrives à une solution avec un seul motif je serais intéressé de la connaître, donc n'hésite pas à la poster smile.gif

Je pense que ceci est bon:
CODE
$motif = "`^(.*)(toto=1234&(.*)|&toto=1234)$`";
preg_match($motif,$chaine,$out);
echo $out[1].$out[3];


Pub: testé avec http://www.annuaire-info.com/expression-reguliere.html . wink.gif

Jean-Luc
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.