[PHP REGEXP]Interdire un motif ?

Résolu
Ben -  
Jean-François Pillou Messages postés 19261 Date d'inscription   Statut Webmaster Dernière intervention   -
Bonjour,
je cherche à récupérer, via un script PHP, les liens hypertextes d'une page HTML et plus précisement le href et le code contenu entre les balises.

Par exemple dans <a href="url">texte cliquable</a> je veux extraire "url" et "texte cliquable".

J'utilise donc les expressions régulières et ça marche dans la plus part des cas avec ça :
preg_match_all('/<a([^>])*href="([^"]+)"([^>])*>(.*)<\/a>/',$html_categorie,$results);

Seulement il peut y avoir plusieurs liens par ligne et là ça ne marche plus, ça ne trouve plus qu'un seul lien commençant par la première balise "<a" et se terminant par la dernière balise "</a>".

J'essaye d'interdire la présence de la balise "</a>" dans le texte cliquable avec une expression de ce style mais ça marche pas :
preg_match_all('/<a([^>])*href="([^"]+)"([^>])*>([^\(<\/a\)]*)<\/a>/',$html_categorie,$results);


Comment interdire un motif et pas seulement un caractère ou une classe ?

Merci d'avance.

3 réponses

Jean-François Pillou Messages postés 19261 Date d'inscription   Statut Webmaster Dernière intervention   63 277
 
Il y a une petite astuce : .*? permet de s'arrêter à la première occurence d'un motif, ainsi, il suffit de faire ceci :

preg_match_all('/<a.*?href=".*?)".*?>( .*?)<\/a>/is',$html_categorie,$results); 


J'ai également ajouté les drapeaux i (insensible à la casse) et s (parenthèses capturantes).
On pourrait aussi ajouter m pour que le motif fonctionne sur plusieurs lignes !
Jean-François Pillou

Fondateur de CommentCaMarche.net

2
Gihef Messages postés 5150 Date d'inscription   Statut Contributeur Dernière intervention   2 779
 
Bonjour,

Je ne connais pas PHP, mais il me semble qu'une “(” manque.
preg_match_all('/<a.*?href="(.*?)".*?>(.*?)<\/a>/is',$html_categorie,$results); 
pour récupérer “uri”.

++
Une question.
Les 1er et 3e motifs .*? prévoient la présence de quoi ?

--
0
Jean-François Pillou Messages postés 19261 Date d'inscription   Statut Webmaster Dernière intervention   63 277
 
Indeed :-)
0