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 :

Remplacement du contenu d'une balise HTML


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut [PREG_REPLACE] Motif pour gérer l'imbrication de balises HTML
    Bonjour à toutes et à tous,

    J'aimerais remplacer le contenu du balise HTML précise (par son id) par autre chose.
    Malgré mes différentes lectures (tuto+topics) au sujet du remplacement des bouts de chaines via REGEX, je ne m'en sort pas...
    Le motif que j'utilise semble fonctionner tant qu'il n'y a pas d'imbrication de balises de même type.

    Dans la chaine suivante, j'aimerais remplacer ce qui est en rouge :
    <div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div>
    Sauf, qu'avec ce motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $pattern = '#(<div(.*)id="id-boite"(.*)>)(.*)(<\/div>)#U';
    $chaine = '<div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div>';
    $remplacement = 'AZERTY';
    echo preg_replace($pattern, "$1".$remplacement."$5", $chaine);
    ?>
    affiche :
    <div id="id-boite">AZERTY</div></p></div>
    Mon remplacement s'arrête donc au premier </ div> !

    Alors comment remplacer correctement tout le contenu du div ?
    Merci d'avance


  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 111
    Points : 74
    Points
    74
    Par défaut
    Ce n'est pas le plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $pattern = '#(<div(.*)id="id-boite"(.*)>)(.*)(<\/div>)#U';
    $chaine = '<div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div>';
    $remplacement = 'AZERTY';
    $chaine = preg_replace($pattern, "$1".$remplacement."$5", $chaine);
    $old=null;
    while ($old !== $chaine){
    	$old = $chaine;
    	$chaine = preg_replace('#(<div[^>]*>.*)</[^>]*></div>#U', "$1".'</div>', $chaine);
    	$chaine = preg_replace('#</div></div>#U', '</div>', $chaine);
    }
    echo htmlentities($chaine);
    ?>
    Mais tu as le resultat que tu désire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="id-boite">AZERTY</div>

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Salut et merci pour ton aide...

    cependant, ta méthode ne fonctionne pas complètement.
    ex avec un < div > englobant.

    demo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    ini_set('display_error', '1');
    $pattern = '#(<div(.*)id="id-boite"(.*)>)(.*)(<\/div>)#U';
    $chaine = '<div><div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div></div>';
    $remplacement = 'AZERTY';
    $chaine = preg_replace($pattern, "$1".$remplacement."$5", $chaine);
    $old=null;
    while ($old !== $chaine){
    	$old = $chaine;
    	$chaine = preg_replace('#(<div[^>]*>.*)</[^>]*></div>#U', "$1".'</div>', $chaine);
    	$chaine = preg_replace('#</div></div>#U', '</div>', $chaine);
    }
    echo htmlentities($chaine);
    ?>
    affiche
    <div><div id="id-boite">AZERTY</div>

  4. #4
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    d'après mes recherches, il y a une notion de récursivité (que je ne maîtrise pas) avec les REGEX pour (éventuellement) résoudre mon problème.

    Savez vous comment je pourrais m'y prendre ? Un p'tit exemple au moins serait super bienvenue...

    Merci d'avance.

Discussions similaires

  1. Recuperer le contenu d'une balise HTML
    Par PIEPLU dans le forum Langage
    Réponses: 1
    Dernier message: 27/12/2013, 19h45
  2. Recuperer le contenu d'une balise HTML
    Par shadowdiablo dans le forum WinDev
    Réponses: 5
    Dernier message: 24/11/2009, 18h50
  3. Remplacer le contenu d'une balise
    Par bubulemaster dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/08/2009, 08h21
  4. Contenu d'une balise HTML
    Par cricrinho dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 11/07/2007, 13h42
  5. [Tableaux] Récupérer le contenu d'une balise HTML
    Par StarNab dans le forum Langage
    Réponses: 2
    Dernier message: 01/09/2006, 12h38

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