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 :

Preg_replace sur des mots contenus dans des balises


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Preg_replace sur des mots contenus dans des balises
    Bonjour à tous et à toutes.
    Je bloque présentement sur un regex et je ne trouve pas le solution. J'aimerais modifier certains mots contenue uniquement dans certaines balises avec du contenue variable.

    Par exemple j'ai le texte suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blabla blabla bacon texte variable<p> contenu variable bacon</p> du texte variable ou plusieurs autre balise <p>bacon</p> rien ou du texte variable
    et mon regex est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace('#(<p>.*)bacon(.*</p>)#s', '$1salade$2', $texte);
    Le contenue du texte est variable, il est donc possible que le mot bacon apparaisse plusieurs fois dans les balises <p> ou 0 fois.


    Lorsque j'utilise se regex, seulement le dernier mot "bacon" est remplacer par "salade", alors que j'aimerai remplacer tout les mots "bacon" contenue dans une balise <p>.

    Aurez-vous des idées ?

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    ajoutez les modificateurs Ug : https://regex101.com/r/rG8rR6/1

    U permet d'être non gourmand et g permet de faire des recherches multiples

  3. #3
    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
    Attention le modificateur g n'existe pas en PHP. preg_replace effectue par défaut un remplacement global (sauf si on renseigne son paramètre limite).

    Si tu cherches à cibler uniquement le texte de certaines balises, utilise DOMDocument pour construire l'arbre DOM et utilise une requête XPath pour sélectionner les nœuds qui t'intéressent.

    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
    $html = <<<'EOD'
    blabla blabla bacon texte variable<p> contenu variable bacon</p> du texte variable ou plusieurs autre balise <p>bacon</p>
    rien ou du texte variable <p>bacon bacon <span> bacon </span> </p>
    <!-- balise dans un commentaire <p>bacon</p> -->
    EOD;
     
    $dom = new DOMDocument;
    $dom->loadHTML('<div>' . $html . '</div>', LIBXML_HTML_NOIMPLIED);
     
    $xp = new DOMXPath($dom);
    // on choisit les nœuds texte contenant la chaîne "bacon" et ayant pour ancêtre un nœud p 
    $textNodes = $xp->query('//text()[contains(., "bacon")][./ancestor::p]');
     
    // on procède au remplacement pour chacun de ces nœuds
    foreach ($textNodes as $textNode) {
        $textNode->nodeValue = preg_replace('~\bbacon\b~', 'salade', $textNode->nodeValue);
    }
     
    // puis on recompose la chaîne à partir de l'arbre DOM
    $result = '';
    foreach ($dom->documentElement->childNodes as $childNode) {
        $result .= $dom->saveHTML($childNode);
    }
     
    echo $result;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. ajout d'event handler sur des objet contenus dans un dataTemplate généré dynamiquement
    Par ElSpopo dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 10/12/2013, 10h57
  2. Réponses: 1
    Dernier message: 27/04/2012, 16h41
  3. Réponses: 5
    Dernier message: 09/09/2011, 23h07
  4. Définir le target des liens contenus dans une balise Object
    Par Booyakha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/02/2007, 15h23
  5. Réponses: 9
    Dernier message: 27/10/2005, 22h38

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