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 :

Str replace balise html


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Str replace balise html
    Bonjour, je ne sais pas comment intitulé cette demande.
    En gros je souhaite retirer les balises <br /> après chaque balise html choisie.
    jusque la pas de problème voici mon code:
    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
    $replace = array(
            // Balise table
            "<table><br />",    // Ouverture tableau
            "</table><br />",   // Fermeture tableau
            "<tr><br />",       //Ouverture de ligne de tableau
            "</tr><br />",      //Fermeture de ligne de tableau
            "<td><br />",       //Ouverture de colonne de tableau
            "</td><br />",      //Fermeture de colonne de tableau
            "<th><br />",       //Ouverture de colonne titre de tableau
            "</th><br />",      //Fermeture de colonne titre de tableau 
     
            //Paragraphe
            "<p><br />",
            "</p><br />",
     
            //Titre
            "<h1><br />",
            "</h1><br />",
            "<h2><br />",
            "</h2><br />",
            "<h3><br />",
            "</h3><br />",
            "<h4><br />",
            "</h4><br />",
     
            //Balise en une ligne:
            "<a><br />", // Lien
            "<b><br />", // Text en gras
            "<i><br />", // text en italique
        );
        $baliseok = '<b><i><table><tr><td><th><h1><h2><h3><h4><br><a><font><xmp><img>';
        $text = strip_tags($text, $baliseok);
        $newreplace = array();
        foreach($replace as $key => $value){ // On nétoie automatoquement le tableau replace
            $newreplace[$key] = str_replace("<br />", "", $value);
        }
     
        $text = str_replace($replace, $newreplace, $text);
        return($text);
    Là où çà devient compliqué c'est que les balises peuvent avoir des arguments comme par exemple <a href="google.com">.

    Saviez vous comment je pourrais sélectionner également ses formes de balise ?
    J'ai essayer en intègrent (.*) comme suit:

    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
    $replace = array(
            // Balise table
            "<table><br />",    // Ouverture tableau
            "</table><br />",   // Fermeture tableau
            "<tr><br />",       //Ouverture de ligne de tableau
            "</tr><br />",      //Fermeture de ligne de tableau
            "<td><br />",       //Ouverture de colonne de tableau
            "</td><br />",      //Fermeture de colonne de tableau
            "<th><br />",       //Ouverture de colonne titre de tableau
            "</th><br />",      //Fermeture de colonne titre de tableau 
     
            //Paragraphe
            "<p><br />",
            "</p><br />",
     
            //Titre
            "<h1><br />",
            "</h1><br />",
            "<h2><br />",
            "</h2><br />",
            "<h3><br />",
            "</h3><br />",
            "<h4><br />",
            "</h4><br />",
     
            //Balise en une ligne:
            "<a(.*)><br />", // Lien
            "<b><br />", // Text en gras
            "<i><br />", // text en italique
        );
    Mais cela ne fonctionne pas.

    Bien à vous

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 632
    Points
    15 632
    Par défaut
    str_replace fait uniquement du remplacement de chaines.
    pour avoir un format de sélection plus élaboré, vous pouvez essayer les expressions régulières avec cette fonction par exemple :
    https://www.php.net/manual/fr/function.preg-replace.php

    pour plus d'information sur les expressions régulières, vous pouvez regarder la documentation de php là :
    https://www.php.net/manual/fr/pcre.pattern.php
    et ce site est aussi très utile :
    https://regex101.com/

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 881
    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 881
    Points : 6 607
    Points
    6 607
    Par défaut
    Tu peux utiliser le DOM pour faire des manipulations sur le html, ce qui évite pas mal de travail car il identifie les composants du document et les range dans une structure arborescente.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    // Enlève un tag et le remplace par son contenu
    function removeTag(DOMElement $elt) {
        // On collecte les nœuds enfants de l'élément dans un fragment
        $dom = $elt->ownerDocument;
        $fragment = $dom->createDocumentFragment();
     
        foreach ($elt->childNodes as $node) {
            $fragment->appendChild($node->cloneNode(true));
        }
     
        // pour ensuite le remplacer par ce fragment.
        $elt->parentNode->replaceChild($fragment, $elt);
    }
     
    // Enlève l'élément BR s'il est le premier nœud enfant de $elt, ou le nœud qui le suit immédiatemment.
    function wipeBRs(DOMElement $elt) {
       $firstChild = $elt->firstChild;
     
        if ( $firstChild && $firstChild->nodeType === XML_ELEMENT_NODE && $firstChild->localName === 'br' )
            $elt->removeChild($firstChild);
     
        $nextSibling = $elt->nextSibling;
     
        if ( $nextSibling && $nextSibling->nodeType === XML_ELEMENT_NODE && $nextSibling->localName === 'br' )
            $nextSibling->parentNode->removeChild($nextSibling);
     
    }
     
    $tagWhiteList = [ 'a', 'table', 'tr', 'th', 'td', 'h1', 'h2', 'h3', 'h4', 'b', 'i', 'br', 'a', 'font', 'xmp', 'img', 'p' ];
     
    $text = '<div>Hier</div> <p><br>J\'ai mangé des nouilles.</p><br>';
     
    // si $text n'est pas un document html complet, on le place dans une coquille vide
    // pour éviter que libxml n'applique certaines corrections à la structure html
    // et pour préciser l'encodage.
     
    $html = <<<HTML
    <!DOCTYPE html>
    <html><head><meta charset="utf-8" /></head>
    <body>$text</body></html>
    HTML;
     
    libxml_use_internal_errors(true);
     
    // on construit l'arbre DOM
    $dom = new DOMDocument;
    $dom->loadHTML($html);
     
    // ainsi qu'un objet DOMXPath pour pouvoir l'interroger avec le langage de requêtes XPath
    $xp = new DOMXPath($dom);
     
    // On demande tous les éléments (=tags) descendants de body
    $query = '/html/body//*'; 
    $elts = $xp->query($query);
     
    // On applique un traitement sur ces éléments suivant s'ils sont ou non dans la whitelist
    for ($i = $elts->length - 1; $i >= 0; $i--) {
        $elt = $elts->item($i);
     
        if ( in_array($elt->localName, $tagWhiteList) ) {
            wipeBRs($elt);
        } else {
            removeTag($elt);
        }
    }
     
    // on concatène ensemble les nœuds enfants de body pour avoir la chaîne finale
    $result = '';
     
    $bodyChildNodes = $xp->query('/html/body[1]/node()');
     
    foreach ($bodyChildNodes as $node) {
        $result .= $dom->saveHTML($node);
    }
     
    echo $result;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [Débutant] qui connait (String.replace) pour remplacer une balise html
    Par gilout123 dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/08/2014, 02h23
  2. [HTML 5] Comment replacer les balises html à la ligne?
    Par Nanou999 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 22/12/2011, 10h11
  3. Réponses: 2
    Dernier message: 11/06/2008, 09h32
  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