Ereg_replace et expression réguliére

Résolu
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010 - 14 avril 2009 à 12:12
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010 - 8 oct. 2009 à 16:47
Bonjour,

Je souhaite enlever tout ce qui ce trouve entre crochets [] (inclut).

Voici mon problème :

$chaine="blabla blabla[truc truc] machin machin [bidule bidule] fin.";
$result=ereg_replace("\[(.*)\]","",$chaine);

Cela donne :
"blabla blabla fin."

Alors que je souhaiterai :
"blabla blabla machin machin fin.

Je ne comprends pas pourquoi il ne fait pas toutes les occurrences entre crochet?!
Au lieu de cela il prend le 1er crochet en ouverture qu'il trouve et le dernier en fermeture...

Merci de votre aide.

13 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
14 avril 2009 à 20:26
Plutôt ça d'ailleurs :
$result = preg_replace('`\[[^]]+]`', '', $chaine);

Fais quelques tests avant

Kohntark -
3
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
15 avril 2009 à 10:08
Merci à tous pour votre aide.
DiGhan ton expression ne fonctionne pas...
Entre temps j'ai trouvé une autre façon de faire qui fonctionne aussi bien et même mieux dans un cas de figure ou il n'y a rien entre les crochets [] :
preg_replace("@\[[\!]*?[^\[\]]*?\]@","",$chaine);

Je vous avous que je ne comprend pas tous ce qu'implique cette expression, je l'ai "bidouillé" sans comprendre certaine de ses composantes... si quelqu'un se sent capable de m'expliquer pas à pas je suis preneur.
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
15 avril 2009 à 19:54
J'ai l'impression que certaines parties de ta regex ne servent à rien.
Pourquoi faire si compliqué ??

Si tu veux également inclure les [] vides il suffit de faire :
preg_replace('`\[[^]]*]`', '', $chaine);

C'est beaucoup plus simple et surtout : c'est plus de 2 fois plus rapide !!

Cordialement,

Kohntark -
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
14 avril 2009 à 20:24
Salut Valentino,

C'est pourtant si simple les regex !!!

Cela devrait convenir :
$result = preg_replace('`\[[^]]+\]`', '', $chaine);

Cordialement,

Kohntark -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
15 avril 2009 à 09:27
Salut,

Ou simplement ceci :

preg_replace('#\[.*?\]#', '', $string);
0
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
15 avril 2009 à 09:30
Mes excuses, petite explication :

Le caractère '?' à la fin d'une séquence .*|.+ permet de limiter le parsing au caractère se trouvant juste après. Dans ton cas, le crochet fermant.
0
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
15 avril 2009 à 22:42
Oops, j'avais mal compris... (d'ailleurs, je n'ai toujours pas saisi ce que devait matcher ton pattern).

'je suis [mauvais] fort en [algebre] sport' => 'je suis fort en sport' (après un replace). C'est bien ça ?
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
15 avril 2009 à 22:57
Salut DiGhan,

Oui, il me semble.

Cordialement,

Kohntark -
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
16 avril 2009 à 09:05
DiGhan : Oui c'était ça le but ^^
Kohntark : Ta dernière expression correspond aussi parfaitement... te sent tu capable de me l'expliquer pas à pas ?

Encore merci à tous.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
16 avril 2009 à 17:17
`\[[^]]*]`




` => délimiteur PCRE


\[ => le caractère [ puisque échappé (pour que le moteur ne l'interprète pas comme l'ouverture d'une classe)

[ => ouverture de la classe


^] => tous les caractères sauf le ] (pas besoin de l'échapper ici puisqu'il est en première position dans la classe et qu'une classe vide n'est pas reconnue)


] => fermeture de la classe

* => rien ou plusieurs fois ce qui précède
(cad
[^]])


] => suivi du caractère ]
` => délimiteur fin

J'espère que ça t'aidera.

Kohntark -
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
16 avril 2009 à 17:43
C'est parfait, merci à toi et la communauté.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
16 avril 2009 à 17:48
bonne continuation

Kohntark -
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
8 oct. 2009 à 16:47
Bonjour à tous, me revoila

J'ai une question subsidiere :

Lorsque j'ai trouvé mon occurence entre croché je souhaite remplacer le contenu par le contenu trouvé

J'ai éssayé je crois que je protége mal mon ereg... Quelqu'un à une idée ?

$result = preg_replace('`\[[^]]+\]`', '`\[\^\<\/font\>+\]`', $chaine);

Merci d'avance.
0
Rejoignez-nous