[PHP REGEXP]Interdire un motif ?

Résolu
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.
Configuration: Windows XP
Internet Explorer 7.0

3 réponses

  1. Webmaster
    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

    1. Contributeur
      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 ?

      --