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 balise [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut Supprimer balise


    Petite question au sujet des expressions régulières. Pour l'écriture d'un parseur, je souhaite supprimer des balises <br /> qui se mettent dans une liste <ul> ou <ol>, ce qui rend le code html non valide.

    Exemple :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Valide :
    <ul>
      <li>elem 1<br />test</li>
      <li>elem 2</li>
    </ul>
     
    Non Valide :
    <ul>
    <br />
      <li>elem<br />test</li>
      <li>elem</li>
      </br>
    </ul>

    J'ai trouvé l'expression régulière pour supprimer les <br />, mais comment faire pour ne les supprimer que dans les balises <ul>...</ul> ou <ol>...</ol> ? J'ai essayé plusieurs codes mais ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Supprime tout les <br />
    $text = preg_replace('`(^|\W)(<br />)(\W|$)`si','$1 $3', $text);
     
    // Ne marche pas
    $text = preg_replace('`<ul>(^|\W)(<br />)(\W|$)</ul>`si','$1 $3', $text);
    Fiquet
    - FAQ SDL
    - FAQ C++

  2. #2
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Il te faut utiliser le modificateur U (ungreedy) pour récupérer les balises une par une.
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = preg_replace(#(<ul>*)(<br />)(.*</ul>)`Usi','\\1 \\3', $text);
    Idem pour <li>

  3. #3
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = preg_replace('#(<ul.*)(<br />)(.*</ul>)#Usi','$1$3', $text);
    Il manquait un dièse... Je crois...
    De plus, je préfère "<ul.*" au cas où il y aurait une mention de style, de classe, etc...
    Et pourquoi un espace en replacant $1 et $3 ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  4. #4
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par guidav
    Il te faut utiliser le modificateur U (ungreedy) pour récupérer les balises une par une.
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = preg_replace(#(<ul>*)(<br />)(.*</ul>)`Usi','\\1 \\3', $text);
    Idem pour <li>
    J'ai essayé avec ton code comme ceci (il manquait le ' et j'ai fermé avec #) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $text = preg_replace('#(<ul>*)(<br />)(.*</ul>)`#','\\1 \\3', $text);
    $text = preg_replace('#(<li>*)(<br />)(.*</li>)`#','\\1 \\3', $text);
    Edit : même chose avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = preg_replace('#(<ul.*)(<br />)(.*</ul>)#Usi','$1$3', $text);
    Fiquet
    - FAQ SDL
    - FAQ C++

  5. #5
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    En fait en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $text = preg_replace('#(<ul.*)(<br />)(.*</ul>)#Usi','$1$3', $text);
    $text = preg_replace('#(<li.*)(<br />)(.*</li>)#Usi','$1$3', $text);
    Il m'affiche

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ul>
    <li>salut</li>
    <li>adieu</li><br />
    <li>manger</li><br />
    </ul>]

    Au lieu de
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ul><br />
    <li>salut</li><br />
    <li>adieu</li><br />
    <li>manger</li><br />
    </ul>
    Donc il y a une amélioration mais il ne remplace qu'un <br />. Comment en remplacer plusieurs ?
    Fiquet
    - FAQ SDL
    - FAQ C++

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Nous sommes bien d'accord que $text contient bien tout le code ?
    Pas que la première ligne...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Nan, je crois savoir.

    Notre regexp chope un <br /> et pense avoir fini.
    Il faut trouver un truc pour qu'elle se répète.

    Essaies juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $text = preg_replace('#(<ul.*)<br />#Usi','$1', $text);
    $text = preg_replace('#(</li>.*)<br />#Usi','$1', $text);
    --- edit ---

    Je m'aperçois que c'est pas encore ça. Je l'ai sur le bout de la langue, mais c'est l'heure de débaucher.
    Ad taleur peut-être...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Merci ça marche enfin ! moi et les regexp ça fait 2, faudra que je pense à étudier un peu cette synthaxe bizarre .



    Edit : bizarre chez moi ça marche
    Fiquet
    - FAQ SDL
    - FAQ C++

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Fiquet
    Edit : bizarre chez moi ça marche
    Oui, mais si tu as par chance une page sans <br /> après les </li>, je pense qu'elle va t'en faire sauter au moins un autre ensuite, ce qui n'est pas bon.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  10. #10
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par jml94
    Oui, mais si tu as par chance une page sans <br /> après les </li>, je pense qu'elle va t'en faire sauter au moins un autre ensuite, ce qui n'est pas bon.
    Effectivement s'il n'y a aucun <br /> ça supprime plus loin .
    Fiquet
    - FAQ SDL
    - FAQ C++

  11. #11
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Je vais essayer plusieurs trucs.

    Le premier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $text = preg_replace('#(<ul.*)<br />(<li>|</ul>)#Usi','$1$2', $text);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  12. #12
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Le deuxième :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    $text = preg_replace('#(</li>.*)<br />(<li>|</ul>)#Usi','$1$2', $text);
    Et peut-être un mix des deux si ça suffit pas...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  13. #13
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Les deux n'ont aucun effet, ni seules, ni ensembles . Aurais-je trouvé la regex impossible ?
    Fiquet
    - FAQ SDL
    - FAQ C++

  14. #14
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    NAN !

    On va y arriver !

    Et ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $text = preg_replace('#(<ul.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
    $text = preg_replace('#(</li>.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
    J'ai rajouté des .* qui peuvent faire la différence.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  15. #15
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par jml94

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $text = preg_replace('#(<ul.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
    $text = preg_replace('#(</li>.*)<br />(.*<li>|</ul>)#Usi','$1$2', $text);
    très bonne idée, et en fusionnant comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $text=preg_replace('#((?:</li>|<[ou]l[^>]*>)\s*).*(\s*(<li[\s>]|</[ou]l>))#Usi','$1$2',$text);

  16. #16
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut


    En fait non, une fois que les bonnes expressions seront repérées, je compte plutôt utiliser des tableaux de correspondance. Question de goût, je trouve ça plus smart, mais ce n'est qu'un avis.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  17. #17
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Et bien en fait la solution de daniel61 fonctionne, mais celle de jml94 avec les deux expressions non. Elles sont censées être équivalentes ? En tout cas la dernière solution fonctionne.
    Fiquet
    - FAQ SDL
    - FAQ C++

  18. #18
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bah, si tu as le choix entre quelque chose qui marche et une autre qui marche pas...

    Well done Daniel !

    J'avais même pas lu ta belle regexp, bloqué que j'étais sur mon idée de tableaux.

    C'est quand même bô une regexp comme ça, nan ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  19. #19
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par Fiquet
    Elles sont censées être équivalentes ?
    oui elles le sont, c'est bien le travail de jml94 et pas le mien.

    la différence est qu'avant de poster il y avait un <br /> au centre et j'ai pensé de le remplacer par .* donc elle enlève tout sauf la mise en forme... donc aucun élément (X)HTML ne seront tolérés à ces endroits pas plus que du texte... seul <li></li> et ce qu'ils contiennent seront entre <ul></ul> et <ol></ol>... à tester tout de même.

    Citation Envoyé par jml94
    C'est quand même bô une regexp comme ça, nan ?
    honnêtement, je ne l'aurais jamais vu sans ton code.

  20. #20
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut


    Je vais essayer de décortiquer un peu ce joli lancé de daniel61.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $text=preg_replace('#((?:</li>|<[ou]l[^>]*>)\s*).*(\s*(<li[\s>]|</[ou]l>))#Usi','$1$2',$text);
    [ou]l : "ol" ou "ul"
    [^>]* : tout caractères sauf ">"
    ?: : parenthèse de regroupement seul, sans capture
    (?:</li>|<[ou]l[^>]*>) : on repère </li> ou <ol...> ou <ul...> sans capturer

    ((?:</li>|<[ou]l[^>]*>)\s*) : on repère </li> ou <ol...> ou <ul...> suivi de blancs et on capture en $1

    (<li[\s>]|</[ou]l>) : on repère <li> ou <li > ou </ol> ou </ul> et on capture en $2

    (\s*(<li[\s>]|</[ou]l>)) : on repère <li> ou <li > ou </ol> ou </ul> précédés de blancs et on capture en $3

    entre les deux, on prend tout et on ne capture pas

    Donc on va remplacer tout ce qui se trouve entre </li>, <ol...> ou <ul...> et <li> ou <li > ou </ol> ou </ul>, le tout en "ungreedy". (merci le Camel Book)

    Cette expression est très belle, mais il y a encore un peu d'amélioration à apporter je pense.
    Après une bonne prise de tête, je vais prendre un café avec les collègues et je reviens voir ce qu'on peut faire.

    PS : pour ce genre d'expressions non-triviales, tu peux aussi demander dans le forum Perl. Ces garçons un peu extra terrestres sont souvent bilingues en regexp.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Supprimer balises entourant un mot ?
    Par Sanceray3 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 19/03/2010, 14h27
  2. [RegEx] Supprimer balise commencant par et finissant par
    Par NissqR dans le forum Langage
    Réponses: 6
    Dernier message: 18/03/2010, 20h14
  3. supprimer balise <img>
    Par alexmorel dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/10/2006, 10h55
  4. [MySQL] supprimer balises html
    Par nicerico dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/09/2006, 22h49
  5. supprimer balises html/css
    Par fr8ncky dans le forum Langage
    Réponses: 6
    Dernier message: 30/11/2005, 14h12

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