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 :

Exclure une chaine dans un motif, pour extraire des liens html [Fait]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Exclure une chaine dans un motif, pour extraire des liens html
    Bonjour,

    Il s'agit surement d'un problème assez simple, et pourtant...

    Je cherche à capturer toutes les urls de liens dans ma page html.

    Autrement dit, imaginez le texte suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bonjour, j'ai <a href="ok1">besoin</a> de votre aide, parce que <a href="ok2">vous êtes = à des pros</a>

    Comment récupérer "ok1" et "ok2" ?
    Actuellement, mon motif était le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/<a href="([^<]*)">([^=]*)<\/a>/';
    Ca a marché, jusqu'à ce que un texte de lien contienne le signe "=", comme dans l'exemple ci-dessus.

    En effet, j'excluais le signe "=", mais pour que ça marche, il faudrait que je puisse exclure exclure une chaine.

    Une sorte de [^MACHAINE]. Ainsi, je ferai le motif suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/<a href="([^<]*)">([^href]*)<\/a>/';
    Mais ça ne marche pas, parce que je ne sais pas exclure une chaine dans un motif. Et ^href n'exclu pas la chaine href...

    Existe t-il une solution ?

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 223
    Points : 15 516
    Points
    15 516
    Par défaut
    essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#<a href="([^"]*)">([^<]*)</a>#';
    regarde aussi cette expression régulière qui est plus développée là :
    http://g-rossolini.developpez.com/tu...page_2#LII-3-b

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    j'ai moi aussi un peu le même probleme et je patauge un peu.
    Je cherche à extraire l'url et le contenu des liens d'un page html.
    Concretement voilà ce que j'appelle url et contenu dans un lien : <a href="url">contenu</a>

    J'ai d'abord utilisé cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/<a([^>])*href="([^"]+)"([^>])*>(.*)<\/a>/'
    mais il ne sort qu'un résultat lorsque 2 liens sont sur la meme ligne, j'ai donc voulu interdire la présence de "</a>" dans le contenu avec une expression de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '/<a([^>])*href="([^"]+)"([^>])*>([^\(<\/a\)]*)<\/a>/'
    mais ce motif là [^\(<\/a\)] ne marche pas.

    Est il possible d'interdire toute une chaine ?

    Merci d'avance

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par Mr. Pink
    mais ce motif là [^\(<\/a\)] ne marche pas.
    C'est tout à fait normal puisque vous utilisez une classe qui a un tout autre but au lieu d'une assertion négative. Une classe, est un ensemble de caractères qu'il faut considérer comme une alternative. [abc] dit que la chaîne doit comporter a ou b ou c et non la chaîne abc. Quand elle est niée c'est la même chose [^abc] : tout caractère qui n'est ni a ni b ni c et non pas une chaîne ne contenant pas abc.

    A priori, il vous manque déjà plutôt, et pour commencer, la spécification du caractère non gourmand de l'expression (option U à la fin de celle-ci) - que l'on peut aussi spécifier de manière individuelle après chaque quantifieur (?, *, +) en le faisant succéder de ?.

    Choisissez également mieux vos délimiteurs ça vous évitera d'avoir à les échapper.

    Mais tout est détaillé dans le tutoriel : Initiation aux expressions régulières en PHP.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette précieuse aide, va falloir que je me penche plus serieursement sur l'etendue des capacités des expressions regulieres.

    Donc voilà avec cette expression ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<a([^>]*)href="([^"]*)"([^>]*)>(.*)</a>#U'
    Ca récupere url et contenu de tous les liens.
    Merci

Discussions similaires

  1. Problème synthaxe pour récuperer des liens (HTML)
    Par stansoad0108 dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2008, 17h37
  2. Extraire une chaine dans une richebox
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/03/2007, 15h19
  3. Extraire pls morceaux d'une chaine dans des variables!
    Par baillador dans le forum Langage
    Réponses: 10
    Dernier message: 05/04/2006, 14h21
  4. Réponses: 15
    Dernier message: 26/03/2006, 13h10
  5. Réponses: 2
    Dernier message: 10/07/2002, 12h51

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