[PHP REGEXP]Interdire un motif ?

Résolu/Fermé
Ben - 9 nov. 2007 à 10:55
Jean-François Pillou Messages postés 18707 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 - 10 nov. 2007 à 00:22
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.
A voir également:

3 réponses

Jean-François Pillou Messages postés 18707 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 63 266
10 nov. 2007 à 00:01
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 mercredi 20 juillet 2005 Statut Contributeur Dernière intervention 20 février 2023 2 775
10 nov. 2007 à 00:11
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 18707 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 63 266
10 nov. 2007 à 00:22
Indeed :-)
0