Aller au contenu

Expressions régulières en PHP


petit-ourson

Sujets conseillés

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.)

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...