|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : août 2006 Messages : 8 ![]() |
Bonsoir !
Je suis sur une regex qui me casse la cabeza... Je suis pas un pro des expressions régulières, mais j'arrive toujours à m'en sortir et finalement à trouver. Hors, celà fait 2 jours que je pense qu'à celle là, et là ca devient trop obsessionnelle, donc j'ai besoin d'aide ^^. Voici un panel d'exemple de string cible : <a href="http://www.lebon.com/test/de/accueil/index.html> <a href="http://www.lebon.com/fr/accueil/index.html> <a href="http://www.lebon.com/accueil/index.html> <a href="test/it/accueil/index.html> <a href="jessaye/nimportequoi/test/pt/accueil/patati/patata/kaisoif.html> <a href="images/accueil/index.html> <a href="http://www.lemauvais.com/test/de/accueil/index.html> J'aimerais donc modifier le mot accueil en home. Mais j'ai plusieurs conditions : - si http dans le href alors que http://www.lebon.com - accueil est forcément précéde de : /(de?|es?|it?|nl?|pt?|gb?|fr?)/ - si il y a un mot dans le href commencant par imag* je ne prends pas en compte. Dans mes exemples les n° 1, 2, et 4 sont bons pas les autres. J'ai commencé par essayer de faire un match et de voir ensuite comment prendre qu'une partie : <a href="(http://www.lebon.com/?)(.*)/(:?fr?|gb?|de?|es?|it?|nl?|pt?)/accueil/ Mais çà m'a embrouillé plus qu'autre chose et je tourne en rond :s Si un regex guru passe par là et a du temps ca me ferait bien plaisir ^^ Merci beaucoup ! Yudao. |
|
|
00
|
|
|
#2 | ||
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 632 ![]() |
Visiblement tu n'as pas donné toutes les conditions car la 5 répond à tes conditions mais tu dis qu'elle est fausse
Sinon je pense que ça fera l'affaire même si ça consomme 3 regex. Code php :
|
||
|
|
00
|
|
|
#3 | |||||||||||
|
Membre habitué
![]() Inscription : décembre 2006 Messages : 109 ![]() |
Citation:
Citation:
Citation:
Citation:
\shref\s*=\s*([\'"]) en capturant le caractère ' ou " la regex pourra utiliser cette capture pour reconnaitre la fin du lien. Citation:
(?(condition)pattern__si_vrai|pattern_si_faux) est la forme d'une conditionnelle. la condition doit obligatiorement être une assertion, le "pattern_si_faux" est optionnel... (?=caractères) est la forme d'une avant positive, l'assertion teste si les caractères suivants le curseur sont identiques... sans déplacer le curseur. (?(?=http://)(?=http://www.lebon.com)) revient à dire que si les caractères suivants " ou ' sont http:// alors poursuivre si et seulement si les caractères suivant " ou ' sont http://www.lebon.com et il n'y a aucun besoin d'un "pattern_si_faux". les assertions ne déplacent pas le curseur, mais comme il n'y a pas de condition en conflit, pas besoin de forcer le déplacement. Citation:
(?:(?!\bimag).)+? permet de parcourir en ungreedy le contenu de href et d'arrêter si un mot débutant par imag est rencontré. Citation:
/(?:de|es|it|nl|pt|gb|fr){1} maintenant, il est temps de faire la capture en \\1 de ce qui précéde /accueil/ pour pouvoir faire une remplacement \\1/home/... Code :
par contre, s'il faut faire le remplacement de /accueil/ seulement si c'est le dernier répertoire, alors il faudra faire une capture en \\3 de la suite si valide bien entendu. ([^/]+?\2) revient à nier le caractère / jusqu'au caractère qui aura été capturé en \\2... le fameux ([\'"]), donc si c'était " alors \2 contiendra ", et si c'était ' alors \2 contiendra '. si un caractère / est rencontré, alors le regex se terminera et aucun remplacement ne sera fait... le tout capturé en \\3 puisque \\2 contient le caractère délimitant le lien. Code :
|
|||||||||||
|
|
00
|
|
|
#4 |
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 632 ![]() |
Ce n'est pas \\2 plutot que \2 ?
Sinon, tres tres bon descriptif. A garder sous le coude ^^ |
|
|
00
|
|
|
#5 | |
|
Membre habitué
![]() Inscription : décembre 2006 Messages : 109 ![]() |
Citation:
|
|
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 632 ![]() |
Ok je connaissai les équivalences \\2 et $2 mais pas \2 ^^
De plus, le {1} n'est pas nécéssaire puisqu'il est compté par défaut... |
|
|
00
|
|
|
#7 | |
|
Membre habitué
![]() Inscription : décembre 2006 Messages : 109 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com