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 :

Regex multiples dans une portion de texte uniquement [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut Regex multiples dans une portion de texte uniquement
    Bonjour,
    J'essaie vainement de résoudre un problème avec une expression régulière.

    Voici le contexte :
    Remplacer dans le texte suivant toutes les occurrences de "Gras>" par "GrasCyan>" mais uniquement les occurrences présentes entre les balises "<Cyan>" et "</Cyan>"

    Texte :
    Soit le kilo <Gras>1</Gras><EuroGras>€</EuroGras><Gras>15</Gras>
    <Cyan>+ <Gras>7</Gras><EuroGras>€</EuroGras><Gras>50</Gras> sur votre compte</Cyan>
    Résultat à obtenir :
    Soit le kilo <Gras>1</Gras><EuroGras>€</EuroGras><Gras>15</Gras>
    <Cyan>+ <GrasCyan>7</GrasCyan><EuroGrasCyan>€</EuroGrasCyan><GrasCyan>50</GrasCyan> sur votre compte</Cyan>
    Avec
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('(Gras>)', '$1GrasCyan>', $str_orig);
    J'arrive à remplacer toutes les occurrences de "Gras>" par "GrasCyan>" mais je n'arrive pas à restreindre le remplacement uniquement sur les occurrences présentes entre "<Cyan>" et "</Cyan>"

    Si une âme charitable passe par ici je lui en serai très reconnaissant.

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    l'idéal pour ça c'est de faire du xquery. ça fait tellement que j'ai pas fait de xquery que j'aurai du mal a t'aider.

    sinon puisque tu utilises des pattern, pourquoi ne pas ajouter la balise <cyan></cyan> a ton pattern avec des conditions suffisament sioux pour eviter l'inclusion multiple...
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Bonjour gene69,
    Merci pour ton retour.
    En fait, je n'ai pas tout dit; j'ai posté dans le forum Regex de PHP mais au final c'est pour utiliser l'expression régulière dans un logiciel de base de données qui s'appelle Filemaker.
    Du coup, pas de xquery...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Je me permet de relancer le sujet.
    N'est-il pas possible d'effectuer de la récurrence sur une partie de texte définie avec une regex?
    Elle est là la solution je pense.
    Mais ça dépasse mes compétences

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Le plus simple et le plus maintenable (et peut-être même le plus performant) consiste à capturer les contenu de la balise <Cyan> puis faire le remplacement.

    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
    <?php
     
    $str = <<<EOT
    Soit le kilo <Gras>1</Gras><EuroGras>€</EuroGras><Gras>15</Gras>
    <Cyan>+ <Gras>7</Gras><EuroGras>€</EuroGras><Gras>50</Gras> sur votre compte</Cyan>
    EOT;
     
    preg_match('#<Cyan>(.*)</Cyan>#', $str, $m);
     
    $pattern = '/Gras>/';
    $replace = '$1GrasCyan>';
     
    $buffer = preg_replace($pattern, $replace, $m[1]);
     
    $final = preg_replace('#<Cyan>.*</Cyan>#', "<Cyan>$buffer</Cyan>", $str);
    var_dump($final);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Bonjour s.n.a.f.u,
    Merci pour ta réponse.
    Comme je le disais dans un message au dessus, je ne bosse pas en PHP mais dans Filemaker (outil de gestion de base de données)
    Cependant la technique que tu me proposes est peut être transposable.
    Il faut que je fasse des tests.
    Je vais quand même mettre le sujet en résolu.
    Encore merci.

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Une variante qui peut éventuellement t'intéresser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    $str = <<<EOT
    Soit le kilo <Gras>1</Gras><EuroGras>€</EuroGras><Gras>15</Gras>
    <Cyan>+ <Gras>7</Gras><EuroGras>€</EuroGras><Gras>50</Gras> sur votre compte</Cyan>
    EOT;
     
    $pattern = '#Gras>(?=.*</Cyan>)#';
    $replace = 'GrasCyan>';
     
    $final = preg_replace($pattern, $replace, $str);
     
    var_dump($final);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Est ce qu'il existe un mot plus fort que "MERCI"????
    Je ne sais pas alors grand merci s.n.a.f.u pour ta dernière réponse. Ça correspond impeccablement à ce que je souhaite faire.

    Mais je n'ai pas tout compris dans le pattern.
    Pourrais tu me dire qu'est ce qui permet de trouver toutes les occurrences de "Gras>" ?
    C'est cette partie "Gras>(?=" ?

    Merci pour ta réponse

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/11/2011, 01h55
  2. [AC-2003] Recherche multiple dans une zone de texte
    Par Orakle dans le forum IHM
    Réponses: 10
    Dernier message: 23/02/2010, 13h57
  3. [RegEx] nl2br dans une portion de chaine uniquement
    Par Pistol Kiss dans le forum Langage
    Réponses: 2
    Dernier message: 03/12/2008, 12h24
  4. Réponses: 8
    Dernier message: 07/12/2007, 20h48
  5. Comment colorier une portion de texte dans un TSynMemo ?
    Par Henri-gp dans le forum Composants VCL
    Réponses: 0
    Dernier message: 29/10/2007, 15h14

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