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

Java Discussion :

Regex Java : extraire la valeur d'un attribut d'une balise HTML


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut Regex Java : extraire la valeur d'un attribut d'une balise HTML
    Bonjour à tous,

    J'ai une chaîne de départ qui représente une balise de lien HTML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://www.google.fr">Aller à Google</a>
    A l'aide d'expressions régulières, je souhaite récupérer la cible du lien "http://www.google.fr"

    J'utilise donc les objets java.util.regex.Matcher et java.util.regex.Pattern comme ceci (la variable tag contient mon lien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pattern p = Pattern.compile("<a href=['\"](.*)['\"]>(.*)</a>");
    Matcher m = p.matcher(tag);
     
    if (m.find()) System.out.println(m.group(1));
    Avec ce code, j'obtiens ce que je souhaite : http://www.google.fr

    Seulement voilà, quand je prends un lien avec plusieurs attributs, comme celui-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://www.google.fr" onclick="javascript:openPop()" rel="...">Aller à Google</a>
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.google.fr" onclick="javascript:openPop()" rel="...
    J'ai bien compris pourquoi : le motif de mon expression extrait toute la chaîne compris entre le premier et le dernier double-guillemets (") de la chaîne.

    Le truc c'est que j'ai bidouillé un peu mon motif mais je n'arrive pas à obtenir ce que je veux. Pour résumé il faudrait extraire uniquement le contenu de l'attribut "Href".

    Merci par avance, je sèche un peu.

    Bonne soirée.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    L'extraction est faite jusqu'au dernier guillemet surtout parce que tu demandes d'extraire jusqu'un " (ou ') suivi d'un >, donc c'est forcément le dernier (sauf s'il y avait une espace entre le " et le >, ou pas de " du tout sur l'attribut...). Il faut donc ajouter un .* avant le >. Mais ça ne suffirait pas, car la recherche est "gourmande" par défaut : il faut utiliser un quantifier reluctant (le ? parès le .* de ton groupe de capture).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern p = Pattern.compile("<a href=['\"](.*?)['\"].*>(.*)</a>");
    Mais il y a tellement d'autres cas à traiter que tu auras toujours d'autres exceptions qui vont complexifier ton expression. Il est beaucoup plus simple d'utiliser un parser html, tel que jsoup par exemple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Bonsoir,

    Merci pour l'astuce, j'avais fini par trouver une autre solution mais celle-ci est plus propre.

    Pour JSoup j'y ai pensé mais pour l'instant comme je ne fais qu'extraire des liens, je préfère rester sur cette solution, bien que son utilisation a l'air très très simple (beaucoup plus que HTML Parser d'après ce que j'ai pu voir).

    A terme, le projet va sûrement traiter d'autres balises et à ce moment là je pense que me servirai de JSoup.

    Merci en tout cas.

Discussions similaires

  1. Récupérer la valeur d'un attribut d'une balise séléctionnée par Spinner
    Par kamclasse dans le forum Composants graphiques
    Réponses: 5
    Dernier message: 16/12/2014, 13h14
  2. [SAX] Problème de récupération d'une valeur dans un attribut d'une balise
    Par Antheadousa dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 10/01/2012, 23h29
  3. valeur d'un attribut d'une balise
    Par bastien dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/01/2010, 13h02
  4. [XSLT]introduire la valeur d'un noeud dans une balise html
    Par delma dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/10/2006, 22h08
  5. Accès aux attributs d'une balise HTML
    Par tatou42 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/02/2006, 14h01

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