|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
Bonjour à tous,
J'aimerais récupérer tous les liens de n'importe quelle page. Moi et un ami avons programmé ce code : Code :
Pouvez-vous nous aider svp pour que ça affiche tous les liens de la page choisie ? Merci d'avance. |
||
|
|
00
|
|
|
#2 | ||
|
Membre chevronné
![]() Inscription : mai 2005 Messages : 657 ![]() |
Salut,
Utilise preg_match_all pour trouver tout les résultat de ton expression régulière (preg_match ne cherche que le premier). Je pense que quelque chose comme ceci devrait fonctionner (je le fais de tête alors je peux me tromper Code :
|
||
|
|
00
|
|
|
#3 | |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
Merci pour ton aide, mais ça marque toujours "Aucun lien trouvé".
Edit: Ah si ça fonctionne, mais cela me donne un résultat étrange. Pour developpez.com : 44 trouvés : Citation:
Je ne met pas [résolu] si d'autres personnes veulent bien nous aider à améliorer le code. Merci |
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Mathias GaunardIngénieur développement logiciels Inscription : décembre 2003 Messages : 3 543 ![]() |
Ce serait plutôt un truc du style #<a\s+href("|'|)(.*)\1\s*>(.*)</a>#is
|
|
|
00
|
|
|
#5 | |||
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
Merci loufoque, mais ce que tu m'a donné est vraiment zarb O_°.
Sinon j'ai essayé ceci : Code :
Citation:
|
|||
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() Mathias GaunardIngénieur développement logiciels Inscription : décembre 2003 Messages : 3 543 ![]() |
Bon j'ai testé mon truc et je l'ai amélioré.
ça récupère tout, même si y'a pas de " ou de ', s'il y a d'autres arguments etc. Code :
#<a\s.*?(?(?<!\s)\s)href=(["'])?((?(1).*?|\S*))(?(1)\1).*?\>(.*?)</a>#is
Tu veux que je t'explique la regex point par point ? |
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
je veux bien
merci beaucoup |
|
|
00
|
|
|
#8 | |||||||||||||
|
Expert Confirmé Sénior
![]() Mathias GaunardIngénieur développement logiciels Inscription : décembre 2003 Messages : 3 543 ![]() |
Argh j'aurais pas du te proposer.
T'as réussi ton truc au moins, ça fonctionne bien ? Bon, # sont les délimiteurs de l'expression régulière. On voit déjà que j'ai spécifié deux options : i (insensible à la casse) et s (le caractère . peut aussi récupérer des retours à la ligne) Ce sont les options qu'on utilise la plupart du temps. Je commence par chercher "<a" suivi d'un espace blanc (espace, retour à la ligne, tabulation, etc.) Puis je recherche n'importe quel caractère (.) présent zéro ou un nombre indeterminé de fois (*) mais de façon non gourmande (?) c'est à dire que cela s'arrête dès la première fois où on trouve la suite de l'expression, alors que si c'était gourmand ça irait jusqu'à la dernière fois. (Voir plus bas sur des infos sur la gourmandise). Tout ceci dans le but de permettre que l'élement <a> dispose d'autres attributs avant href. Cependant il manque encore quelque chose, là ça pourrait prendre <a truchref=etc. alors qu'on ne veut prendre que des trucs genre <a truc href=etc. On fait donc un motif conditionnel, en utilisant pour condition un lookbehind: on regarde si le dernier caractère (détecté par .*?) n'est pas un caractère blanc, et si c'est le cas on oblige l'expression a en contenir un. Ensuite on recherche "href=" puis, éventuellement, le caractère " ou ' que l'on stocke dans 1. On fait ensuite un motif conditionnel (que l'on capture dans 2, ce sera le lien) avec pour condition l'existence de 1. Si 1 existe on prend n'importe quel caractère n'importe quel nombre de fois de façon non-gourmande (.*?) sinon on prend les caractères qui ne sont pas blancs n'importe quel nombre de fois. Ensuite si 1 existe on s'arrête à la prochaine fois qu'on rencontre 1 (j'aurais bien aimé l'intégrer directement dans la première condition mais je n'arrivais alors pas à mettre les valeurs dans le même index) C'est bon, on a récupéré la valeur de l'attribut href. On permet ensuite n'importe quel caractère n'importe quel nombre de fois de façon non gourmande jusqu'à ">" (je l'ai échappé mais en fait y'a pas besoin), puis on capture dans 3 n'importe quel caractère n'importe quel nombre de fois de façon non-gourmande (ce sera l'intitulé du lien) puis on prend </a>. Cela ne pourra pas supporter des <a> imbriqués (ça necessiterait de remplacer le (.*?) par quelque chose de plus complexe) mais de toutes façons cela ne doit pas exister. Voilà, ouf, on a réussi. ça devrait pouvoir récupérer tous les liens de façon parfaite. Bon, les explications sur la gourmandise. On comprend bien avec un exemple, la balise Citation:
Enfin si j'ai " Citation:
Citation:
Citation:
(mettre ?: au début d'une parenthèse permet de ne pas la capturer, les parenthèses servant ici à grouper les élements pour y appliquer des * ou des +) (?!truc) est un lookahead. |
|||||||||||||
|
|
00
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
il ne fonctionne pas chez moi ce regex,
merci en tout cas pour ce mini-cours. PS: Vive les expressions régulières J'ai acheté le gros book : PHP 5 / MySQL 5 : La Référence chez Campus Press (900 pages) Malgré un sous chapitre entièrement consacré aux expressions régulières, ben j'ai toujours du mal à m'en servir mdr... c'est du chinois ! |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Développeur informatique Inscription : août 2005 Messages : 1 179 ![]() |
j'admire ta patience loufoque,
on voit que les regexp c'est vraiment ton truc
__________________
http://cdemarche.developpez.com/ Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
|
|
|
00
|
|
|
#11 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
ouep, puis moi ça fonctionne toujours pas :
Code :
Inspiré de l'exemple de la fonction preg_match_all ici : http://www.expreg.com/pregmatchall.php |
||
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() Développeur informatique Inscription : août 2005 Messages : 1 179 ![]() |
et ça ?
Code :
__________________
http://cdemarche.developpez.com/ Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
|
||
|
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
Loooooool, merci beaucoup
|
|
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : février 2004 Messages : 94 ![]() |
Après une hibernation de quelques mois, je reviens en force pour vous demander encore une fois de l'aide pour la même chose.
Cette fois-ci j'aimerais que ma regex prennent seulement les liens possédant http:// au début. Ceci me semble fonctionner, mais je n'ai pas l'impréssion que ce soit très propre. Si quelqu'un sait comment l'optimiser... Merci d'avance. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com