PHP - identification d'url

Nouveau WRInaute
Le code dans lequel je cherche mon expression est du type :

<h2 class=classe1><a href="http://www.site.com/gabarit.php?cat=cat1&f=3">ma page</a></h2><h2 class=classe1><a href="http://www.site.com/gabarit.php?cat=cat1&f=2">ma page 2</a></h2> etc...

Comme vous le voyez, le code n'est pas formaté ligne par ligne, tout se suit.

Je voudrais pouvoir identifier chaque url :

<a href="http://www.site.com/gabarit.php?cat=cat1&f=3">ma page</a>

Comment je fais pour que mon identification s'arete a chaque balise </a> pour pouvoir ensuite afficher toutes les chaines trouvées ?

j'ai fais ca mais ca ne marche pas :

preg_match_all('/\<a href="(.*)(www.site.com)+(.*?)(<\/a>)+/Ui',$file_contents,$out);

la chaine semble ne pas s'areter a chaque </a> trouvé, mais plutot au tout dernier </a> trouvé dans l'ensemble du code.

comment faire ?

Merci !
 
Nouveau WRInaute
j'ai testé, mais ca ne fonctionne toujours pas :

preg_match_all('/\<a href="(.*?)(www.site.com)+(.*?)(<\/a>)+/Ui',$file_contents,$out);


L'identification va toujours jusqu'au dernier </a> trouvé dans tout le code, pas le premier rencontré après "www.site.com".

Hors je voudrais pouvoir identifier chaque lien, 1 par 1.

A+
 
WRInaute accro
heu, pourquoi *? ça fait doublon, non ?
il faut plutôt remplacer (.*) par ([^>]*) et ça fonctionnera
 
WRInaute discret
Gill's a dit:
preg_match_all('/\<a href="(.*?)(www.site.com)+(.*?)(<\/a>)+/Ui',$file_contents,$out);


L'identification va toujours jusqu'au dernier </a> trouvé dans tout le code, pas le premier rencontré après "www.site.com".

Hors je voudrais pouvoir identifier chaque lien, 1 par 1.

Plutôt une regexp comme ça?

'(<a href="(https?)://www.site.com([^"]*)[^<]*</a>)'

matche pas les sous-domaines de :www.site.com ni les liens relatifs (et que le protocole http|https)

Les backreferences devraient te donner le mode http|https, la query string, et la balise entière de <a> à </a>

Bon courage avec les regexp ;)
 
Discussions similaires
Haut