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 :

Supprimer des balises HTML imbriquées les une dans les autres


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut Supprimer des balises HTML imbriquées les une dans les autres
    Bonjour,

    Je cherche à supprimer d'un texte certaines balises HTML ayant une certaine class. Alors j'ai essayé avec une expression régulière du type <mabalise.+</mabalise> et des trucs plus élaborés mais ça ne marche pas dans la pratique.

    Par exemple, mettons que j'ai le code suivant au milieu du code HTML d'une page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="element1"><span class="element2" style="background-position: -100px;"><span class="element3" style="width: 52px; "></span></span>Salut</span>
    Je veux supprimer le contenu du span de class element1 et le span avec. Mais si je veux faire ça bien, il ne faut pas que ça s'arrête au premier </span>. Il faut qu'il compte combien ont été ouverts avant.

    Connaissez vous une bonne manière de faire ça ?

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 36
    Points : 53
    Points
    53
    Par défaut
    Bonjour,
    pour faire ce que tu souhaite une expression régulière ne peut pas marcher car tu ne peut pas compter dans combien de balise tu est imbriqué.
    Je pense qu pour faire ton traitement tu peut :
    1-chercher avec un regex le début de ce que tu cherche (<mabalise)
    2-a partir de la tu met un compteur à 1
    3-tu parcours la suite, tu incrémente a chaque fois que tu retrouve ta balise, tu le décrémente quand tu trouve une fermeture. tu arrête quand ton compteur est égal à 0 car tu est à la position de ta balise fermante correspondant a la balise trouvé en 1.
    4-tu peut traiter l'intérieur des 2 balise comme tu le souhaite (supprimer)
    5-tu peut retourner à l'étape 1 pour traiter la fin de ta chaine

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Ok j'avais espéré qu'il existe une api pour ça mais je pense qu'il va falloir coder le truc

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Je poste ici le code avec lequel j'ai réussi à régler mon problème au cas où quelqu'un en aurait besoin.
    Si quelqu'un voit une amélioration du côté performance à y apporter je suis preneur car mon logiciel est assez sensible à la perf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    	static String eleverTagClass(String code,String tag, String classe)
    	{
    		Matcher m=find("<"+tag+" [^>]*class=\""+classe+"\"",code);
     
    		if(m.find())
    		{
    			int debut=m.start();
    			int fin=-1;
    			int nbTagIdentiqueEntre=0;
     
    			String codeCouper=code.substring(m.end());
    			Matcher m2=find("<"+tag+">|<"+tag+" |</"+tag+">",codeCouper);
     
    			while(m2.find())
    			{
    				String tagTrouve=codeCouper.substring(m2.start(), m2.end());
     
    				if(!tagTrouve.contains("/")) nbTagIdentiqueEntre++;
    				else
    				{
    					if(nbTagIdentiqueEntre==0)
    					{
    						fin=m2.end();
    						break;
    					}
    					else nbTagIdentiqueEntre--;
    				}
    			}
     
    			if(fin>-1)
    			{
    				return code.substring(0, debut)+code.substring(m.end()+fin);
    			}
    		}
     
    		return code;
    	}

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    éventuellement considérer ce fichier comme du xml et non du html
    comme ça tu manipules facilement tes éléments avec une API genre SAX ou DOM4J

    je ne sais pas si c'est faisable car cela dépend aussi du reste du texte

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    éventuellement considérer ce fichier comme du xml et non du html
    comme ça tu manipules facilement tes éléments avec une API genre SAX ou DOM4J
    Ou jsoup au cas où ce ne soit pas vraiment compatible XML.

    Deux problèmes toutefois :
    - ces outils sont bien plus fiables, mais bien plus lents niveau perfs qu'un bricolage peu fiable mais qui marche assez bien.
    - En cas de contenu invalide, jsoup l'acceptera quand même, mais le réparera dans sa mécanique interne. Ce qu'on écrit peut être très différent de ce qu'on a lu, même si en HTML ce serait interprété pareil.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/09/2009, 15h13
  2. Supprimer des balises HTML et leurs contenus
    Par neeux dans le forum Langage
    Réponses: 1
    Dernier message: 02/11/2008, 20h44
  3. instructions TYPE imbriquées les unes dans les autres
    Par Beralienne dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/04/2008, 16h15
  4. supprimer des balises HTML specifiques
    Par sergio94 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/03/2008, 10h39
  5. Balises les unes dans les autres
    Par Nibor dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 31/10/2006, 15h56

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