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] Suppression de blocs de balises HTML


Sujet :

Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut [Regex] Suppression de blocs de balises HTML
    Bonjour,

    je cherche à supprimer des blocs de balises du code source d'une page HTML (par exemple <style>...</style> et tout ce qu'il y a entre ces deux balises).

    Actuellement, j'utilise cette méthode, à laquelle je passe en paramètre la balise qui encadre le texte que je veux supprimer :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private String ExeRegExp(String bal, String page) {
      String patternStrBase = "<(" + bal + ").*?</\\1>";
      String replacementStr = "";
      Pattern pattern = Pattern.compile(patternStrBase);
      Matcher matcher = pattern.matcher(page);
      page = matcher.replaceAll(replacementStr);
      return page;
    }

    Ça fonctionne parfaitement pour <style> par exemple... mais pas pour <script>.
    Je l'ai testé sur le code de la page d'accueil de Google.fr : les balises <script> et </script> sont bien éliminées... mais pas ce qu'il y avait entre les deux.
    En revanche, l'ensemble de la feuille de style est bien éliminé.

    Je me suis certainement fourvoyé quelque part... mais où ? (d'autant que je ne maîtrise pas trop les expression régulières...)

    Merci pour vos réponses !

    Alban

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    Je pense que ça a à voir avec les sauts de ligne (\n) qui sont particuliers et pas pris dans le .*?
    Il faudrait que tu supprimes de ton String page toutes les occurences de \n au préalable, ce qui ne devrait pas être genant si c'est du HTML.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par RegBas Voir le message
    Il faudrait que tu supprimes de ton String page toutes les occurences de \n au préalable, ce qui ne devrait pas être genant si c'est du HTML.
    Tu peux aussi utiliser DOTALL pour spécifier que le point prennent aussi les retour à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern pattern = Pattern.compile(patternStrBase, Pattern.DOTALL);
    Je te conseillerais aussi d'utiliser CASE_INSENSITIVE pour ignorer la case.
    A noter que tu peux directement utiliser respectivement (?s) et (?i) en début du pattern à la place des paramètres de la méthode compile()...



    De plus je te conseillerais fortement d'utiliser Pattern.quote() autour de ton paramètre 'bal' lors de la concaténation, afin de protéger d'éventuel caractères spéciaux qui pourraient être interprété et fausser/casser ta regexp (voir FAQ : Comment empêcher les expressions régulières d'interpréter une sous-chaînes ?).



    Enfin tu peux te passer des classes Pattern et Matcher puisque le replaceAll() est directement intégré à la classe String, ce qui revient au même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	private String exeRegExp(String bal, String page) {
    		return page.replaceAll(
    				"(?i)(?s)<(" + Pattern.quote(bal) + ").*?</\\1>"
    				, "");
    	}

    a++

    PS : Les noms de méthodes ne commencent pas par une majuscule

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    J'en apprends tous les jours... et je m'émerveille à chaque fois
    Plus sérieusement, merci ! (y compris pour le PS)
    Tout fonctionne parfaitement !

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

Discussions similaires

  1. Suppression d'un type balises HTML
    Par wehtam dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/09/2011, 16h23
  2. problème regex suppression balises HTML
    Par crazydindon dans le forum Langage
    Réponses: 6
    Dernier message: 11/09/2007, 14h39
  3. [REGEX] suppression d'un bloc interne
    Par erwan.bodere dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 23/04/2007, 16h44
  4. Suppression balise HTML en Javascript
    Par calahaan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/01/2007, 22h18
  5. [Regex] Balises Html
    Par onegamer dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 09/08/2005, 16h34

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