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 :

Fusion de balise HTML [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Par défaut Fusion de balise HTML
    Bonjour,
    je cherche un moyen du fichier des balises HTML.
    Pour le contexte, ce code HTML est écrit par Adobe Indesign donc assez moche.

    Voici ce que j'ai dans le fichier généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span>
    et voici ce que je souhaite obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="refid-valeur char-style-override-6">RCR-ART-RCR-L213-1</span>
    Je dois faire le nettoyage automatique du fichier HTML pour le rendre propre car il y a des traitements automatique dessus.

    Avez-vous une idée si cela est faisable avec une expression régulière ou une autre méthode en PHP ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Par défaut
    Bonsoir

    En premier lieu faudrait savoir quel code génére ces span

  3. #3
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Essaie ça. A peine testé.

    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
     
     
    <?php
    $remplacePar = '~#####~';
    $modele      = "/(<span[^>]+>)(.*?)($remplacePar)/msi";
    $finTag      = '</span>';
    $debTag      = '<span class="refid-valeur char-style-override-6">';
    $aRemplacer  = "$finTag$debTag";
    $texte       = '<div><span class="toto">titi</span><span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span><span class="toto">tata</span></div>';
    var_dump($texte);
     
    $texte2      = str_replace($aRemplacer,$remplacePar,$texte);
    var_dump($texte2);
    $texte3      = preg_replace($modele,"<a href="file://\\1\\2$debTag",$texte2,1" target="_blank">\\1\\2$debTag",$texte2,1</a>);
    var_dump($texte3);
    $texte4      = str_replace($remplacePar,"",$texte3);
    var_dump($texte4);

    Bien que j'aie décoché la conversion automatique des liens le forum transforme quand même la ligne qui commence par $texte3 =

    Nom : Capture20180707_001.JPG
Affichages : 207
Taille : 16,1 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    string(257) "<div><span class="toto">titi</span><span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span><span class="toto">tata</span></div>"
     
    string(110) "<div><span class="toto">titi~#####~RCR-ART-RCR-L~#####~213~#####~-1</span><span class="toto">tata</span></div>"
     
    string(152) "<div><span class="toto">titi<span class="refid-valeur char-style-override-6">RCR-ART-RCR-L~#####~213~#####~-1</span><span class="toto">tata</span></div>"
     
    string(138) "<div><span class="toto">titi<span class="refid-valeur char-style-override-6">RCR-ART-RCR-L213-1</span><span class="toto">tata</span></div>"

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Effectivement pas assez testé.

    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
     
    <?php
    $remplacePar = '~#####~';
    $modele      = "/(<span[^>]+>)(.*?)($remplacePar)/msi";
    $finTag      = '</span>';
    $debTag      = '<span class="refid-valeur char-style-override-6">';
    $aRemplacer  = "$finTag$debTag";
    // $texte       = '<div><span class="toto">titi</span><span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span><span class="toto">tata</span></div>';
    // var_dump($texte);
    $texte       = '<div><span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span></div>';
    var_dump($texte);
    $texte      = str_replace($aRemplacer,$remplacePar,$texte,$nombreRemplacements);
    var_dump($texte);
    if ($nombreRemplacements % 2 == 1)
    {
     $texte = preg_replace($modele,"<a href="file://\\1\\2$debTag",$texte,1" target="_blank">\\1\\2$debTag",$texte,1</a>);
     var_dump($texte);
    }
    $texte      = str_replace($remplacePar,"",$texte);
    var_dump($texte);
    Même remarque que pour le message précédent pour la regexp.

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 018
    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 : 3 018
    Par défaut
    En utilisant les classes DOM***:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    $html=<<<'EOD'
    <html><head></head><body>
    <span>autre</span><span class="refid-valeur char-style-override-6">1RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span>
    <span>autre</span><span class="refid-valeur char-style-override-6">2RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span>
    </body></html>
    EOD;
     
    $dom = new DOMDocument;
    $dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
    $xp = new DOMXPath($dom);
     
    $firstElts = $xp->query('//span' // un element span n'importe où dans l'arbre DOM
       . '[@class="refid-valeur char-style-override-6"]' // avec l'attribut class recherché
       // qui n'est pas immédiatement précédé par un élément avec les mêmes caractéristiques
       . '[not(preceding-sibling::node()[1][local-name()="span"][@class="refid-valeur char-style-override-6"])]'
       // mais dont le nœud qui le suit immédiatement est un élément avec les mêmes caractéristiques
       . '[following-sibling::node()[1][local-name()="span"][@class="refid-valeur char-style-override-6"]]');
     
     
    function isSameElt($node1, $node2) {
        if ( $node1->nodeName !== $node2->nodeName )
            return false;
     
        if ( $node1->attributes->length !== $node2->attributes->length ) 
            return false;
     
        foreach ( $node1->attributes as $attr ) {
            if ( !$node2->hasAttribute($attr->name) || $node2->getAttribute($attr->name) !== $attr->value )
                return false;
        }
        return true;
    }
     
     
    $toDelete = [];
     
    foreach ($firstElts as $firstElt) {
     
        $current = $firstElt;
     
        while ( null !== $current = $current->nextSibling ) {
            if ( !isSameElt($firstElt, $current) )
                break;
     
            foreach ($current->childNodes as $childNode) {
                $firstElt->appendChild($childNode->cloneNode(true));
            }
            $toDelete[] = $current;
        }
    }
     
    foreach ($toDelete as $node) {
        $node->parentNode->removeChild($node);
    }
     
    echo $dom->saveHTML();

  6. #6
    Invité
    Invité(e)
    Par défaut
    @CosmoKnacki

    Je t'attendais sur une regex-de-la-mort-qui-tue, et tu nous sors le DOM...

    R.E.S.P.E.C.T !
    Dernière modification par Invité ; 08/07/2018 à 09h13.

  7. #7
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Super intéressante cette discussion.
    Mes codes précédents fonctionnaient dans des cas particuliers mais pas dans tous. Celui semble être plus générique mais comme il est tard ....

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    function toto($html)
    {
     $pattern     = "/(<(\S+)[^>]+>)(.*)(<\/\\2>)|(<\/{0,1}(\S+)[^>]+>)/msiU"; 
     preg_match_all($pattern,$html,$array);
     //var_dump($array);
     $tagATraiter = '<span class="refid-valeur char-style-override-6">';
     $inter       = array();
     $inter2      = array();
     foreach ($array[1] as $key => $value)
     {
      if ($value != $tagATraiter)
      {
       if (count($inter) > 1)
       {
        for($i=1;$i<count($inter);$i++)
        {
         $html = preg_replace('~'.$inter[$i].'~',"",$html,1);
        }
        $html = preg_replace('~'.$inter[0].'~',$tagATraiter.implode('',$inter2)."</span>",$html,1);
       }
       $inter = array(); 
       $inter2= array();  
      }
      else
      {
       $inter[]  = $array[0][$key];
       $inter2[] = $array[3][$key];
      }
     } 
     if (count($inter) > 1)
     {
      for($i=1;$i<count($inter);$i++)
      {
       $html = preg_replace('~'.$inter[$i].'~',"",$html,1);
      }
      $html = preg_replace('~'.$inter[0].'~',$tagATraiter.implode('',$inter2)."</span>",$html,1);
     } 
     return $html;
    }
    $texte1 = '<div><span class="toto">titi</span><span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span><span class="toto">tata</span><span class="refid-valeur char-style-override-6">AAAAA</span></div><span class="refid-valeur char-style-override-6">vvvvvv</span><span class="refid-valeur char-style-override-6">ffffff</span>';
    var_dump($texte1);
    var_dump(toto($texte1));

    Code html : 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
     
    AVANT :
    <div>
     <span class="toto">titi</span>
     <span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span>
     <span class="refid-valeur char-style-override-6">213</span>
     <span class="refid-valeur char-style-override-6">-1</span>
     <span class="toto">tata</span>
     <span class="refid-valeur char-style-override-6">AAAAA</span>
    </div>
    <span class="refid-valeur char-style-override-6">vvvvvv</span>
    <span class="refid-valeur char-style-override-6">ffffff</span>
     
     
    APRES :
    <div>
     <span class="toto">titi</span>
     <span class="refid-valeur char-style-override-6">RCR-ART-RCR-L213-1</span>
     <span class="toto">tata</span>
     <span class="refid-valeur char-style-override-6">AAAAA</span>
    </div>
    <span class="refid-valeur char-style-override-6">vvvvvvffffff</span>

  8. #8
    Membre expérimenté Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Par défaut
    bonsoir, la version DOM semble détruire des données lorsqu'il y un span dans le span: le dernier div
    https://3v4l.org/O1UNq

    résultat texte attendu:
    special espace
    RCR-ART-RCR-L213-1
    séquence avec child PAS DE PROBLÈME ICI?
    résultat texte obtenu:
    special espace
    RCR-ART-RCR-L213-1
    séquence avec child P DBLÈME
    au risque de me faire crucifier, une variante d'une solution temporaire... que j'ai depuis longtemps
    https://regex101.com/r/KueYKk/1

    mais je préfèrerais de loin une version DOM de fusion de 2 balises HTML5.

    le code HTML5 de test a été soumis avec succès à
    https://validator.w3.org/#validate_by_input

  9. #9
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 018
    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 : 3 018
    Par défaut
    @daniel61

    Pour corriger le problème, il suffit de remplacer $firstElt->appendChild($childNode); par $firstElt->appendChild($childNode->cloneNode(true)); afin de copier le nœud avec ses descendants.

    @jreaux62

    Merci pour tes encouragements.

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Par défaut
    Merci beaucoup pour vos retours, cela marche parfaitement avec le parcours du DOM.

  11. #11
    Membre expérimenté Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    $firstElt->appendChild($childNode->cloneNode(true));
    excellent !

+ 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