petit-ourson Posté 8 Mars 2007 Posté 8 Mars 2007 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 : $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 (Je ne cherche pas une autre technique, mais une réponse à ce problème.)
TheRec Posté 8 Mars 2007 Posté 8 Mars 2007 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 : $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 Bonne continuation.
petit-ourson Posté 8 Mars 2007 Auteur Posté 8 Mars 2007 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 Posté 8 Mars 2007 Posté 8 Mars 2007 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.)) : $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
petit-ourson Posté 8 Mars 2007 Auteur Posté 8 Mars 2007 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 Posté 8 Mars 2007 Posté 8 Mars 2007 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
Jeanluc Posté 9 Mars 2007 Posté 9 Mars 2007 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 Je pense que ceci est bon: $motif = "`^(.*)(toto=1234&(.*)|&toto=1234)$`";preg_match($motif,$chaine,$out);echo $out[1].$out[3]; Pub: testé avec [i]http://www.annuaire-info.com/expression-reguliere.html . Jean-Luc
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant