[PHP REGEXP]Interdire un motif ?

Résolu
Ben -  
Jean-François Pillou Messages postés 18961 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.
Configuration: Windows XP
Internet Explorer 7.0

3 réponses

  1. Jean-François Pillou Messages postés 18961 Date d'inscription   Statut Webmaster Dernière intervention   63 308
     
    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
  2. Gihef Messages postés 5165 Statut Contributeur 2 781
     
    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
  3. Jean-François Pillou Messages postés 18961 Date d'inscription   Statut Webmaster Dernière intervention   63 308
     
    Indeed :-)
    0