Expression régulière

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

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

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

Obtenir
http://www.msn.be
MSN
https://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 ?
 
WRInaute occasionnel
Je tenterais cela :
\[\[([^\]]*)\]\]

Ca va ainsi te stoquer dans $1 la chaîne :
http://www.msn.be||MSN
ou la chaîne
https://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=https://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 :!:
 
WRInaute accro
SuperPJ a dit:
Je tenterais cela :
\[\[([^\]]*)\]\]

Ca va ainsi te stoquer dans $1 la chaîne :
http://www.msn.be||MSN
ou la chaîne
https://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=https://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 !
 
WRInaute impliqué
Ok dac donc en php ça va te donner ça

Code:
echo preg_replace("/\[\[([^\|]*)\|\|([^\|]*)\]\] /sIU", "<p><a href="$1">$1</a><br />$2</p>", "[[http://www.msn.be||MSN]]");
 
WRInaute occasionnel
ecocentric a dit:
Je cale sur une expression regulière assez simple à première vue :

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

Ce que je veux, c'est les chaînes
http://www.msn.be||MSN
https://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 dit:
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 [ ...
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut