IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Extraires les liens d'un contenu HTML [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 14
    Points
    14
    Par défaut Extraires les liens d'un contenu HTML
    Bonjour,

    Je bute sur la création d'un pattern permettant de trouver des liens dans un contenu HTML (je sais qu'il serait possible d'agir sur le DOM directement, mais ma question porte bien sur les regexp).

    Si mes liens étaient tous de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="adresse">texte</a>
    Ce ne serait pas bien difficile :

    Sauf que je peux avoir des liens comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <a href="adresse">texte<br />texte</a>
    <a href="adresse">texte<strong>texte</strong>texte</a>
    <a href="adresse">texte<strong><em>tex</em>te</strong>texte</a>
    ...
    Il me faudrait un pattern du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @<a[^>]+>[n'importe quoi sauf la chaîne </a>]*</a>@
    Mais cela ne semble pas possible ? J'ai beau me pencher sur les assertions avants ou arrières, je ne m'en sorts pas.

    Du coup, j'ai opté pour une solution "brute" mais qui marche ! Je remplace tout d'abord dans mon texte HTML les expressions </a> par un caractère n'ayant que peu de chance d'apparaître (comme ¤ ou autre).

    Ce qui me permet d'écrire le pattern suivant :

    Mais je souhaitais me tourner vers les pros des regexs pour savoir s'il n'était pas possible de trouver un patter qui fonctionne dans mon cas, ce qui serait moins "bricole" que ma solution (et sûrement plus performant également).

    Merci,
    Dimitri

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Points : 24
    Points
    24
    Par défaut
    tu peux essayer ce pattern:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /<a[^>]+>(.*?)(?:<\/a>)/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Salut,

    Non, ça ne fonctionne pas. Car si on a 2 liens qui se suivent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="adresse">texte<br />texte</a> <a href="adresse">texte<strong>texte</strong>texte</a>
    Le pattern n'en retourne qu'un. Normal, il extrait cela :

    texte bla bla<a href="adresse">texte<br />texte</a> <a href="adresse">texte<strong>texte</strong>texte</a> texte blabla

    Il prends depuis le premier <a> jusqu'au dernier </a>

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    J'essaierais un truc assez simple, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match_all('#.*(<a[^>]*href.+>.*</a>).*#isU',$str,$match);
    if (isset($match[1])) print_r($match[1]);
    (le href c'est pour éviter de récupérer des ancres)
    Enfin bon c'est juste en passant car je ne suis pas spécialiste des regex et si j'avais à le faire, comme tu le dis plus haut j'essaierais plutôt avec DOMDocument

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Bravo !!!

    Alors moi je passe des heures dessus et toi, en 3 secondes, tu trouves la solution

    Je ne connaissais pas l'option U, voilà que je suis devenu moins bête.

    J'ai vraiment du mal, en terme de logique intellectuelle concernant les regex...

    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/06/2011, 12h06
  2. RegEx pour extraire les liens d'une page html
    Par herch dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 13/05/2009, 17h26
  3. Extraire les liens des fichiers flash
    Par bluecurve dans le forum Langage
    Réponses: 3
    Dernier message: 16/03/2006, 21h24
  4. Réponses: 7
    Dernier message: 14/09/2005, 10h50
  5. réinitialiser les liens d'une page html
    Par sisco dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/11/2004, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo