Page 1 sur 1

habla regex ?

Posté : 04 mars 2009, 00:32
par kanaille
Bonsoir,

Je suis en train d'apprendre une nouvelle langue : le regex :-)

Je m'amuse beaucoup avec. Ca ne me sert pas à grand chose car je suis débutant mais ça fait travailler mes méninges et j'adore :-)

Alors voilà mon problème :

J'ai un string qui contient des liens comme ça :
<a href='ligue1.php'>ligue1</a><br><a href='ligue2.php'>ligue2</a><br><a href='ligue3.php'>etc.etc.

Chaque balise de lien est donc séparée par un <br>.

Je souhaite extraire "<a href='ligue2.php'>ligue2</a>" mais mon code plante :

Code : Tout sélectionner

$regex="#<a(.*?)(ligue2|d2)(.*?)>$#is";
Ca me récupère tous les liens, à mon avis à cause du (.*?) qui m'embarque tous les <a et >.

Comment faire pour limiter à la balise qui ne contient que ligue2 ou d2 ?

Merci de m'aider pour régler ce super sudoku :-)

Posté : 04 mars 2009, 01:57
par Invité
Bonjour,

tu devois utiliser un déboguer pour des expressions régulières:
http://kodos.sourceforge.net/ (Kodos)

Bonne chance et bon courage pour votre projet!
Innocentus

Re: habla regex ?

Posté : 04 mars 2009, 08:59
par Ripat
Je suis en train d'apprendre une nouvelle langue : le regex (...) Ca ne me sert pas à grand chose car je suis débutant(..)
Détrompe-toi. L'apprentissage des regex te sera utile non seulement pour Php mais aussi pour de nombreux autres langages évolués tels qe Perl, Java, Python etc. Ou aussi, dans une version moins puissante il est vrai, pour des utilitaires systèmes Unix/Linux/BSD/OSX tels que awk, sed, grep et aussi pour MySQL.

Ce n'est donc jamais du temps perdu.
J'ai un string qui contient des liens comme ça :
<a href='ligue1.php'>ligue1</a><br><a href='ligue2.php'>ligue2</a><br><a href='ligue3.php'>etc.etc.

Je souhaite extraire "<a href='ligue2.php'>ligue2</a>" mais mon code plante :
(...)
Ca me récupère tous les liens, à mon avis à cause du (.*?) qui m'embarque tous les <a et >.
Comportement normal puisque tu demandes d'extraire la chaîne qui commence pa <a (il prendra donc le premier <a ) puis tout caractère jusqu'à ce que le moteur regex rencontre ligue2 et ensuite tout caractère jusqu'à un > en fin de chaîne (ancrage $).

Au lieu du dot qui prend tout caractère, utilise plutôt les classes négatives comme [^<]+ qui prendra tout caractère tant que le moteur ne rencontre pas le caractère <.

Entraîne-toi sur ton problème sur ce testeur

Posté : 04 mars 2009, 09:12
par stopher
Salut ,

Je ne suis pas un expert en Expreg , mais voilà ce que j'ai trouvé :

<a href='ligue2.*\/a>

Qui donne donc :
$chaine = "<a href='ligue1.php'>ligue1</a><br><a href='ligue2.php'>ligue2</a><br>";

preg_match('/<a href=\'ligue2.*\/a>/', $chaine, $matches);

print_r(htmlspecialchars($matches[0]));
affiche : -> <a href='ligue2.php'>ligue2</a>

Voilà ,

Bonne continuation ,

Ch.

Posté : 04 mars 2009, 15:51
par kanaille
Bonjour !!

Et surtout merci car j'ai pas mal appris grace à vous !!! Au réveil, je me suis dis qu'à la limite, je pouvais stocker les infos dans un tableau pour faire cette recherche mais j'ai laissé tomber car j'aurais appris à progresser en php, pas en regex :lol:

Vos réponses m'ont bien été utiles car j'ai compris pas mal de choses.

J'ai continué à pousser un peu le vice en compliquant l'histoire : et si "ligue2" se trouvait soit dans le href= soit à l'intérieur des balises du type :

Code : Tout sélectionner

<a href='ligue1.php'>ligue1</a><br><a href='ligue2.php'>c'est la ligue2</a><br><a href='ligue3.php'>
OU

Code : Tout sélectionner

<a href='ligue1.php'>ligue1</a><br><a href='l2.php'>c'est la ligue2</a><br><a href='ligue3.php'>
Et bah regex c'est archi puissant !!! J'ai trouvé la solution qui est la suivante :

Code : Tout sélectionner

#((<a[^<]+(ligue2|d2)?[^<]+(ligue2|d2)</a>)|(<a[^<]+(ligue2|d2)[^<]+(ligue2|d2)?</a>))#is
Je vais continuer à travailler sur regex et puis voir comment l'intégrer dans mes compils sous linux. Ca va m'occuper quelques jours je pense...ou années :D

Merci à tous !!! \:D/