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 :

Balises HTML strong et em encastrées / entrelacées [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Balises HTML strong et em encastrées / entrelacées
    Bonjour à tous,

    Je suis à la recherche d'une expression régulière qui me permettra d'identifier les zones de textes contenant des balises em et strong imbriquées.
    par exemple je souhaiterais pouvoir détecter les chaînes de caractères de ce type :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong>du texte</strong> avec des <strong> caractères<em> qui</strong> peuvent</em> être <strong>spéciaux <em>avec des</em> caractères relou</strong> et tout ça

    je souhaite récupérer
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <strong> caractères<em>
    </strong> peuvent</em>
    <strong>spéciaux <em>

    j'ai déjà plusieurs regexp mais celle-ci sont trop restrictives ou permissives
    voici celles qui laissent passer trop de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    preg_match("/(<strong>(.*?)<em>)/ui", $champ)
    preg_match("/(<em>(.*?)<strong>)/ui", $champ)
    preg_match("/(<\\/strong>(.*?)<\\/em>)/ui", $champ)
    preg_match("/(<\\/em>(.*?)<\\/strong>)/ui", $champ)
    Mon expression régulière va récupérer par exemple <em>du contenu </em> encore du contenu <strong>
    pour me dire que le contenu est récupéré entre les balises <em>et<strong> . J'aurais souhaité qu'elle ne remonte rien car nous avons un </em>. Nous n'avons plus de balises entrelacées ou encastrées.

    et celles qui n'en laissent pas assez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    preg_match("/(<strong>[\w\s\-;=,:*-/'."'".'&]+<em>)/ui", $champ)
    preg_match("/(<em>[\w\s\-;=,:*-/'."'".'&]+<strong>)/ui", $champ)
    preg_match("/(<\\/strong>[\w\s\-;=,:*-/'."'".'&]+<\\/em>)/ui", $champ)
    mon problème est que je veux reconnaître tout type de texte entre ces deux balises : les §è!çà/+= et éventuellement d'autres balises HTML.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("/(<\\/em>[\w\s\-;=,:*-/'."'".'&]+<\\/strong>)/ui", $champ)
    Mon but est de simplifier ces balises pour transcoder uniquement du texte qui serait entièrement constitué de gras, d'italique ou de gras italique.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong>ceci est un <em>texte qui est </em> plutôt cool</strong>
    deviendrait
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong>ceci est un </strong><strong><em>texte qui est </em></strong><strong> plutôt cool</strong>

    Merci par avance pour vos retours.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Tout d'abord merci pour l'édite avec les balses code.

    Est-ce que quelqu'un aurait un petit retour pour moi?

    Merci d'avance, bon week-end à tous

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong>du texte</strong> avec des <strong> caractères<em> qui</strong> peuvent</em> être <strong>spéciaux <em>avec des</em> caractères relou</strong> et tout ça
    Si je puis me permettre de supposer [1] qu'il peut y avoir des imbriquations mal-formées au sens xhtml (strong-em-/strong-/em), puisqu'il y en a, et que s'il y a de mal-formations, les mal-formations ne sont pas profondes (strong-em-em-strong-/em-/strong-/em, ou n'importe quoi) et [2] de supposer si strong et em sont imbriquées bien-formées, elles sont formées sans la profondeurs plus qu'une (et c'est bien raisonnable parceque leurs contenus sont plutôt des textes).

    En tenant compte ce qui est souhaité
    Mon but est de simplifier ces balises pour transcoder uniquement du texte qui serait entièrement constitué de gras, d'italique ou de gras italique.
    je peux propser ceci qui en même temps corrige les imbriqation mal-formées aussi.
    Code php : 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
    //etc etc dont $champ est bien définie
    $patterns=array();
     
    $patterns[0]='/(<strong>)([\s\S]+?)(<em>)/';
    $patterns[1]='/(?<=<strong><em>)([^<]*?)(<\/strong>)/';
    $patterns[2]='/(?<=<strong><em>)([^<]*?)(<\/em>)/';
    $patterns[3]='/(<strong><\/strong>)|(<em><\/em>)/';
     
    $replacements=array();
     
    $replacements[0]='<strong>$2</strong><strong><em>';
    $replacements[1]='$1</em></strong><em>';
    $replacements[2]='$1</em></strong><strong>';
    $replacements[3]='';
     
    //la solution proposée est $ret
    $ret=preg_replace($patterns, $replacements, $champ);
     
    echo '$champ :', "\n", $champ, "\n", '$ret :', "\n", $ret;
    Il montre cette résultat :
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $champ :
    <strong>du texte</strong> avec des <strong> caractères<em> qui</strong> peuvent</em> être <strong>spéciaux <em>avec des</em> caractères relou</strong> et tout ça
    $ret :
    <strong>du texte</strong> avec des <strong> caractères</strong><strong><em> qui</em></strong><em> peuvent</em> être <strong>spéciaux </strong><strong><em>avec des</em></strong><strong> caractères relou</strong> et tout ça

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Tout d'abord merci.
    Je pense que je n'aurais pas le temps de tester tout ça ce soir, mais en tout cas ce sera très certainement fait ce week-end.
    Je reviendrai vers toi quoi qu'il en soit et clôturerai si besoin.

    Pour ce qui est des balises strong et em elles devraient être bien formées. Le texte provient de tynimce, donc il devrait toujours y avoir autant de balises ouvrantes que fermentes.

    merci encore, à bientôt

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour ce qui est des balises strong et em elles devraient être bien formées.
    Ce n'est pas du tout le cas dans l'exemple que tu as donné où les balises se chevauchent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong> caractères<em> qui</strong> peuvent</em>
    .

    Du coup, on se dit que la principale difficulté que tu rencontres est de réparer du code HTML mal formé. Si tu avais pris le temps de relire ton message tu aurais eu une réponse depuis belle lurette.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut presque parfait
    Bonjour,

    j'ai testé la fonction et j'ai un petit soucis
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><strong>Oportu<em>num</em></strong><em>est, ut arbitror, explanare nunc<strong>causam</strong>, quae ad ex</em>itium praecipitem Aginatium inpulit iam inde a priscis maioribus nobilem, ut locuta est pertinacior fama. nec enim super hoc ulla documentorum rata est fides.</p><p>Hinc ille<em>commotus ut iniusta perferens et indigna praefecti custodiam protectoribus mandaverat fidis. quo conperto Montius tunc quaestor acer quidem</em>sed ad<em><strong>lenitatem</strong></em>propensior, consulens in commune advocatos palatinarum primos scholarum adlocutus est mollius docens nec decere haec fieri nec prodesse addensque vocis obiurgatorio sonu quod si id placeret, post statuas Constantii deiectas super adimenda vita praefecto conveniet securius cogitari.</p><p>Et quoniam inedia gravi adflictabantur, locum petivere Paleas nomine, vergentem in mare, valido muro firmatum, ubi conduntur nunc usque commeatus distribui militibus omne latus Isauriae defendentibus adsueti. circumstetere igitur hoc munimentum per triduum et trinoctium et cum neque adclivitas ipsa sine discrimine adiri letali, nec cuniculis quicquam geri posset, nec procederet ullum obsidionale commentum, maesti excedunt postrema vi subigente maiora viribus adgressuri.</p>

    devient

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <p><strong>Oportu</strong><strong><em>num</em></strong><em>est, ut arbitror, explanare nunc<strong>causam</strong>, quae ad ex</em>itium praecipitem Aginatium inpulit iam inde a priscis maioribus nobilem, ut locuta est pertinacior fama. nec enim super hoc ulla documentorum rata est fides.</p><p>Hinc ille</strong><strong><em>commotus ut iniusta perferens et indigna praefecti custodiam protectoribus mandaverat fidis. quo conperto Montius tunc quaestor acer quidem</em></strong><strong>sed ad<em><strong>lenitatem</strong></em>propensior, consulens in commune advocatos palatinarum primos scholarum adlocutus est mollius docens nec decere haec fieri nec prodesse addensque vocis obiurgatorio sonu quod si id placeret, post statuas Constantii deiectas super adimenda vita praefecto conveniet securius cogitari.</p><p>Et quoniam inedia gravi adflictabantur, locum petivere Paleas nomine, vergentem in mare, valido muro firmatum, ubi conduntur nunc usque commeatus distribui militibus omne latus Isauriae defendentibus adsueti. circumstetere igitur hoc munimentum per triduum et trinoctium et cum neque adclivitas ipsa sine discrimine adiri letali, nec cuniculis quicquam geri posset, nec procederet ullum obsidionale commentum, maesti excedunt postrema vi subigente maiora viribus adgressuri.</p>

    l'erreur est localisée au niveau de l'italique du deuxième paragraphe
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <p>Hinc ille<em>commotus ut iniusta perferens et indigna praefecti custodiam protectoribus mandaverat fidis. quo conperto Montius tunc quaestor acer quidem</em>sed ad<em><strong>lenitatem</strong></em>propensior, consulens in commune advocatos palatinarum primos scholarum adlocutus est mollius docens nec decere haec fieri nec prodesse addensque vocis obiurgatorio sonu quod si id placeret, post statuas Constantii deiectas super adimenda vita praefecto conveniet securius cogitari.</p>
    remplacé par
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <p>Hinc ille</strong><strong><em>commotus ut iniusta perferens et indigna praefecti custodiam protectoribus mandaverat fidis. quo conperto Montius tunc quaestor acer quidem</em></strong><strong>sed ad<em><strong>lenitatem</strong></em>propensior, consulens in commune advocatos palatinarum primos scholarum adlocutus est mollius docens nec decere haec fieri nec prodesse addensque vocis obiurgatorio sonu quod si id placeret, post statuas Constantii deiectas super adimenda vita praefecto conveniet securius cogitari.</p>

    la balise
    s'est transformé en
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    </strong><strong><em>....

    la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $patterns[0]='/(<strong>)([\s\S]+?)(<em>)/';
     
    $replacements=array();
     
    $replacements[0]='<strong>$2</strong><strong><em>';
    serait donc à modifier.

    Merci d'avance

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Ce n'est pas du tout le cas dans l'exemple que tu as donné où les balises se chevauchent: .

    Du coup, on se dit que la principale difficulté que tu rencontres est de réparer du code HTML mal formé. Si tu avais pris le temps de relire ton message tu aurais eu une réponse depuis belle lurette.
    Désolé, la problématique est bien celle-ci...

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je fais un peu de nettoyage et de mise en forme plus conhérente. J'ai redouté et redoute encore des imbriquations de balises trop profondes et incontrollées (pour html ici), mais heureusement dans le genre concret dont le cas montré comme un exemplaire, on peut administrer assez comfortablement. Voici une version révisionée dans cette direction : les effets pas trop ambitieux sont [1] corrigés mal-formations de strong et em en tout cas pour un sous-ensemble d'elles, [2] ne laissant que des combinaisons <strong>text</strong>, <em>text</em> et <strong><em>text</em></strong>, comme si <strong><em> est une particule ou une balise elle-meme, toujours à côté l'une l'autre dans cette ordre, même pas l'inverse.
    Code php : 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
    //etc etc dont $champ est bien définie
    $patterns=array();
     
    $patterns[0]='/(<strong>)([^<]+?)(<\/strong>)/';
    $patterns[1]='/(<em>)([^<]+?)(<\/em>)/';
    $patterns[2]='/(<strong>)([^<]+?)(<em>)/';
    $patterns[3]='/(<em>)([^<]+?)(<strong>)/';
    $patterns[4]='/(?<=<strong><em>)([^<]*?)(<\/strong>)/';
    $patterns[5]='/(?<=<strong><em>)([^<]*?)(<\/em>)/';
    $patterns[6]='/(<em><strong>)/';
    $patterns[7]='/(<\/strong><\/em>)/';
    $patterns[8]='/(<strong><\/strong>)|(<em><\/em>)/';
     
    $replacements=array();
     
    $replacements[0]='<strong>$2</strong>';
    $replacements[1]='<em>$2</em>';
    $replacements[2]='<strong>$2</strong><strong><em>';
    $replacements[3]='<em>$2</em><strong><em>';
    $replacements[4]='$1</em></strong><em>';
    $replacements[5]='$1</em></strong><strong>';
    $replacements[6]='<strong><em>';
    $replacements[7]='</em></strong>';
    $replacements[8]='';
     
    //la solution proposée est $ret
    $ret=preg_replace($patterns, $replacements, $champ);
     
    echo '$champ :', "\n", $champ, "\n", '$ret :', "\n", $ret;
    Testez-le pour voir si on doit apporter encore des corrections.

    ps : si on doit travailler beaucoup ce genre de manoeuvre, très délicat en fait, la librairie htmltidy peut porter secours au premier étape et puis on travaille avec après. Il suffit d'activer le support d'extension php_tidy.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    C'est bon pour!

    encore merci pour ce travail!

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

Discussions similaires

  1. [JEditorPane]ajout de balises html
    Par almass dans le forum Composants
    Réponses: 12
    Dernier message: 12/05/2004, 17h07
  2. XSLT et balise HTML div
    Par haypo dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/07/2003, 20h38
  3. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24
  4. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29
  5. [XSLT] inclure du XSL dans une balise html
    Par iaa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/08/2002, 15h57

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