Ereg_replace et expression réguliére [Résolu]

Signaler
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010
-
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010
-
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.
A voir également:

13 réponses

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

Fais quelques tests avant

Kohntark -
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
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 -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut Valentino,

C'est pourtant si simple les regex !!!

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

Cordialement,

Kohntark -
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Salut,

Ou simplement ceci :

preg_replace('#\[.*?\]#', '', $string);
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
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.
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
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 ?
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut DiGhan,

Oui, il me semble.

Cordialement,

Kohntark -
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
`\[[^]]*]`




` => 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 -
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

C'est parfait, merci à toi et la communauté.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
bonne continuation

Kohntark -
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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.