Expression régulière

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


ecocentric
WRInaute accro
WRInaute accro
 
Messages: 3577
Inscription: Mar Fév 10, 2004 16:40

Expression régulière

Message le Ven Fév 04, 2005 1:29

Je cale sur une expression regulière assez simple à première vue :

Je pense que [[http://www.msn.be||MSN]] est plus mieux que [[http://www.google.com||Google]].

Ce que je veux, c'est les chaînes
http://www.msn.be||MSN
http://www.google.com||Google

Obtenir
http://www.msn.be
MSN
http://www.google.com
Google
serait bien aussi.

J'ai bêtement essayé
\[\[(.*)\]\]
mais ça ne marche pas.
En fait, il prend tout ce qui va du premier [[ au dernier ]]. J'ai essayé de remplacer le . par [^\[] mais ça n'arrange pas les choses.

Une idée ?


SuperPJ
WRInaute passionné
WRInaute passionné
 
Messages: 513
Inscription: Sam Jan 15, 2005 5:44

Message le Ven Fév 04, 2005 1:35

Je tenterais cela :
\[\[([^\]]*)\]\]

Ca va ainsi te stoquer dans $1 la chaîne :
http://www.msn.be||MSN
ou la chaîne
http://www.google.com||Google


Sinon tu peux faire :
\[\[([^\|]*)\|\|([^\|]*)\]\]

et ça donne :
pour la 1ère expression => $1=http://www.msn.be et $2=MSN
pour la 2nde expression => $1=http://www.google.com et $2=Google


Ainsi, en Perl, un :
$expression = '[[http://www.msn.be||MSN]]';
$expression =~ s/\[\[([^\|]*)\|\|([^\|]*)\]\]/$1\n$2\n/;
print $expression;

t'affichera :
http://www.msn.be
MSN


Si tu as d'autres questions n'hésite pas ;) sans me vanter je suis assez bon en regexp :!:


Fire Wolf
WRInaute passionné
WRInaute passionné
 
Messages: 903
Inscription: Jeu Déc 11, 2003 13:37

Message le Ven Fév 04, 2005 5:10

Je comprend rien à ce charabia... C'est quoi ? :|

tuisp
WRInaute accro
WRInaute accro
 
Messages: 2076
Inscription: Ven Juin 27, 2003 18:33

Message le Ven Fév 04, 2005 8:47



ecocentric
WRInaute accro
WRInaute accro
 
Messages: 3577
Inscription: Mar Fév 10, 2004 16:40

Message le Ven Fév 04, 2005 9:52

SuperPJ a écrit:Je tenterais cela :
\[\[([^\]]*)\]\]

Ca va ainsi te stoquer dans $1 la chaîne :
http://www.msn.be||MSN
ou la chaîne
http://www.google.com||Google


Sinon tu peux faire :
\[\[([^\|]*)\|\|([^\|]*)\]\]

et ça donne :
pour la 1ère expression => $1=http://www.msn.be et $2=MSN
pour la 2nde expression => $1=http://www.google.com et $2=Google


Ainsi, en Perl, un :
$expression = '[[http://www.msn.be||MSN]]';
$expression =~ s/\[\[([^\|]*)\|\|([^\|]*)\]\]/$1\n$2\n/;
print $expression;

t'affichera :
http://www.msn.be
MSN


Si tu as d'autres questions n'hésite pas ;) sans me vanter je suis assez bon en regexp :!:


Ok, je vais tester ça, merci !

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Ven Fév 04, 2005 10:10

J'ai pas compris quelle était la chaine de départ, celle avec [[...]] ou sans ?


ecocentric
WRInaute accro
WRInaute accro
 
Messages: 3577
Inscription: Mar Fév 10, 2004 16:40

Message le Ven Fév 04, 2005 10:42

The Jedi a écrit:J'ai pas compris quelle était la chaine de départ, celle avec [[...]] ou sans ?


Avec [[...]]

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Ven Fév 04, 2005 12:23

Ok dac donc en php ça va te donner ça

Code: Tout sélectionner
echo preg_replace("/\[\[([^\|]*)\|\|([^\|]*)\]\] /sIU", "<p><a href="$1">$1</a><br />$2</p>", "[[http://www.msn.be||MSN]]");


SuperPJ
WRInaute passionné
WRInaute passionné
 
Messages: 513
Inscription: Sam Jan 15, 2005 5:44

Re: Expression régulière

Message le Ven Fév 04, 2005 16:20

ecocentric a écrit:Je cale sur une expression regulière assez simple à première vue :

Je pense que [[http://www.msn.be||MSN]] est plus mieux que [[http://www.google.com||Google]].

Ce que je veux, c'est les chaînes
http://www.msn.be||MSN
http://www.google.com||Google

J'ai bêtement essayé
\[\[(.*)\]\]
mais ça ne marche pas.
En fait, il prend tout ce qui va du premier [[ au dernier ]].

Ah oui Ecocentric j'oubliais de t'en expliquer la raison : c'est que par defaut les quantifieurs : "?", "*" et "+" cherchent à "matcher" le maximum de caractères possibles. C'est pour cela que ".*" te prend tout ce qui a du premier [[ au tout dernier ]]. C'est ce qu'on appelle du "greedy matching".

Il existe un quantifieur qui indique explicitement de "matcher" le MINIMUM de caractères (donc faire du "non greedy matching"), c'est le quantifier "*?". Mais je ne suis pas sûr que ce quantifieur existe dans la version des regexp inclues dans php (c'est pour cela que je n'ai pas utilisé .*? dans mon message initial), mais en tout cas il existe dans les versions de Perl 5 et supérieures. Grâce à ce quantifieur, tu remplaces donc ton \[\[(.*)\]\] par un \[\[(.*?)\]\] et ça va régler le problème de quantifieur "trop gourmand" :D

ecocentric a écrit:J'ai essayé de remplacer le . par [^\[] mais ça n'arrange pas les choses.

Tu t'es juste trompé de sens pour le crochet intérieur : c'est ] et non [ ...


Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité