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 :

Supprimer les balises <DIV *>


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Supprimer les balises <DIV *>
    Bonjour,

    Voila je me galère avec les expressions regulières. J'ai cherché sur le forum mais j'ai pas trouver ma soluce
    En fait je cherche a supprimer toutes les balises DIV et SPAN dans une chaine de caractère mais je ne sais pas comment faire.

    Les balises DIV et SPAN commencent toutes par :
    <DIV kelkechose> ou <SPAN kelkechose>
    et se terminent toutes par </DIV> ou </SPAN>

    En fait je me galère surtout pour le kelkechose

    J'ai essayer un truc comme ça mais ça marche pas, et tpout cause me direz vous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace("<div|span.+[^>]>", "NADA", $aTEST[$i]['CHAPEAU']);
    En fait je comprends rien aux expressions regulières. Au secours !

    Merci

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Il faut bien voir que les fonctions preg_() ont besoin de délimiteurs de ton expression. Pourquoi ? Simplement car cela te permet de spécifier des modificatuers après ton expression.
    Un très grand nombre de caractères peut servir de délimiteur en PHP. Ici, j'imagine que PHP a pris "<" et ">" pour délimiter ton expression, ce qui fait qu'ils ne sont pas contenus dans le masque réel.

    Voici ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<(?:div|span)[^>]*>.*</(?:div|span)>#Usi'
    Le souci avec ce genre de trucs est qu'il va aussi remplacer <div>bouh</span>...
    Je te recommande de le faire en deux fois (une DIV et une SPAN).

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut sculpteur
    Yogui
    est ce que votre code marche avec php 4.*?
    car j'ai eu l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: eregi_replace(): REG_BADRPT in h:\program files\easyphp1-8\www\sup_tags\sup_tags.php on line 12
    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 777
    Points
    17 777
    Par défaut
    C'est une syntaxe PCRE (Perl Compatible Regular Expressions) donc valable uniquement avec les fonctions de l'extension éponyme (fonctions preg_*). Il serait bon de prendre note du caractère "obsolète" des fonctions dites POSIX (ereg*) : elles ne sont pas aussi performantes et souples que les autres et ne font plus partie du core.

    Et au cas où : Initiation aux expressions régulières en PHP

    (j'oubliais de préciser que ces fonctions PCRE n'ont pas de pré-requis quant à la version de PHP)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Yogui Voir le message
    Salut

    Il faut bien voir que les fonctions preg_() ont besoin de délimiteurs de ton expression. Pourquoi ? Simplement car cela te permet de spécifier des modificatuers après ton expression.
    Un très grand nombre de caractères peut servir de délimiteur en PHP. Ici, j'imagine que PHP a pris "<" et ">" pour délimiter ton expression, ce qui fait qu'ils ne sont pas contenus dans le masque réel.

    Voici ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<(?:div|span)[^>]*>.*</(?:div|span)>#Usi'
    Le souci avec ce genre de trucs est qu'il va aussi remplacer <div>bouh</span>...
    Je te recommande de le faire en deux fois (une DIV et une SPAN).
    Bonjour,

    petite question sur ta regexp :

    En fait, j'ai le même problème que deloo mais après avoir suivi le cours sur ce site, je suis arrivé à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<font(.*)>(.*)</font>#Usi'
    Ce qui fonctionne très bien. En conséquence de quoi je ne vois pas l'utilité de la séquence [^>]* dans l'exemple de Yogi ?

    Edit : en fait j'ai compris : [^>]* veut dire : "tous les caractères (de 0 à n pour la quantité) sauf le >"

    "?:" : kezako ? Après moulte recherche (car l'explication du tuto n'est pas très claire, j'ai trouvé à http://www.expreg.com/optimisation.php :


    Dans la mesure du possible, si vous ne devez pas capturer certaines parties de votre masque, rendez vos parenthèses (alternative) non capturante.
    Dans le masque de l'exemple ci-dessus, vous remarquerez que je l'ai fait grâce à ?:
    comme ceci : '`(p(?:a|i|o)f)`i'
    En faisant comme cela, vous allégez la charge de moteur de regex et vous rendez vos regex plus rapide.
    Ensuite, je ne veux pas supprimer la chaine entre balise FONT, il faut donc que je trouve la soluce. Je continue à chercher pour ce second point.

    Edit : J'ai trouvé pour ça aussi : je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pattern='#<font(.*)>(.*)</font>#Usi' ;
    preg_replace($pattern,"$2", $string);
    En gros, la partie comprise au niveau de la 2ème parenthèse capturante sert de chaine de remplacement.

    merci
    à+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Points : 91
    Points
    91
    Par défaut
    Re,

    J'ai une autre question en rapport avec les expressions régulières et l'appel de preg_replace.

    En gros, en faisant comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pattern = "#<span[^>]*>(.*)</span>#Usi";
    $string = '<span align="test>texte n°1 <span>PARTIE 2</span> fin texte 1</span> <span>ZONE 3</span>' ;
    $string = preg_replace($pattern,"$1", $string);
    $string renverra :

    texte n°1 <span>PARTIE 2 fin texte 1</span> ZONE 3
    En clair, la première ouverture de SPAN et la première fermeture seront éliminées.
    Vu que je veux éradiquer les SPAN, je dois faire une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (preg_match($pattern, $string))
       $string = preg_replace($pattern,"$1", $string);
    La question qui en découle est donc la suivante :existe-t-il une regexp qui face ça et si oui laquelle ?
    Si déjà je suis dedans autant aller jusqu'au bout de l'apprentissage

    Je vous remercie !

    à+

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    Bonjour
    -cela supprime les balises div:
    $chaine = preg_replace("@</?div[^>]*?>@si", '', $chaine);
    -et celui là supprime les balises div avec leur contenu
    $chaine = preg_replace("@<div[^>]*?>.*?</div>@si", '', $chaine);


    mais la 2eme ne fonctionne pas tout le temps et je crois c'est parce que qu'elle n'inclut pas quelques caractères spéciaux.

Discussions similaires

  1. [RegEx] Supprimer les balises HTML
    Par Anduriel dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2008, 16h51
  2. Supprimer les balises d'un texte
    Par SimoX1 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/03/2007, 11h40
  3. [Système] Supprimer les balises php d'un texte
    Par madcorp dans le forum Langage
    Réponses: 6
    Dernier message: 04/03/2007, 16h48
  4. [XML] Supprimer les balises vides
    Par junior6 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/09/2006, 09h34
  5. [RegEx] Supprimer les balises HTML
    Par hisy dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2006, 17h10

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