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 :

Remplacer des ',' seulement dans les '(' et ')' [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut Remplacer des ',' seulement dans les '(' et ')'
    Bonjour,

    j'ai besoin de remplacer les , qui se trouvent dans chaque groupe de parenthèses.

    J'ai réussi à le faire, mais seulement que pour une parenthèse.

    Que faut-il faire pour que çà marche pour des blocs de parenthèses contenant plusieurs , ?

    Voici l'exemple :

    lorem (ipsum, dolor), sit a (,dfd) met, (consectetuer ,adapis ,elit) plop ,d ddd
    doit devenir :

    lorem (ipsum@ dolor), sit a (@dfd) met, (consectetuer @adapis @elit) plop ,d ddd
    mais je n'arrive qu'à :

    lorem (ipsum@ dolor), sit a (@dfd) met, (consectetuer @adapis ,elit) plop ,d ddd
    regex :
    (\(.*?),(.*?\))
    replace :
    \1@\2
    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Points : 366
    Points
    366
    Par défaut
    bonsoir,
    ce doit être un truc comme çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function RemplaceVirgule($z){
    $retour=str_replace("'"," ",$z);
    return $retour;
    }
    $text=preg_replace('#\(([^]]*)\)#e','RemplaceVirgule("\\1")',$text);
    Emmanuel
    --------------------------------------
    aucune réponse en message privé.
    les discussions doivent profiter à tous.

  3. #3
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Voici le résultat :

    lorem ipsum@ dolor)@ sit a (@dfd) met@ (consectetuer @adapis @elit plop ,d ddd
    C'est étrange, çà me détruit des parenthèses et des virgules en dehors.

    On ne peut pas le faire sans passer par un bout de code php ?

    Je veux dire, un regex complet qui fait tout.

  4. #4
    Membre actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $string = "lorem (ipsum, dolor), sit a (,dfd) met(asd), (consectetuer ,adapis ,elit) plop ,d ddd";
    $string = preg_replace_callback('#(\\([^\\)]+\\))#', create_function('$matches', "return str_replace(',', '@', \$matches[1]);"), $string);
    echo $string; // lorem (ipsum@ dolor), sit a (@dfd) met(asd), (consectetuer @adapis @elit) plop ,d ddd
    Par exemple...

  5. #5
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Un peut déçu que çà ne soit pas faisable juste avec preg_replace.

    Merci tout de même, çà fait ce qu'il fallait.

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_replace('#\((.*),(.*)\)#Usi', '($1@$2)', $chaine);


    Sauf que seulement la première , est remplacée par couple de parenthèses...Aux pros des regex d'améliorer ca ^^

  7. #7
    Membre actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    Par défaut
    Donc, dans le meilleur des cas, il faut une fonction récursive pour tout modifier (on ne connait pas préalablement le nombre d'occurrences de la virgule).

    Je crois que preg_replace_callback est bien le moyen le plus simple pour faire cela, nous n'avons pas le choix de sortir toutes les parenthèses d'une chaîne pour les transformer.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/06/2015, 00h44
  2. [XL-2010] Exécuter une macro seulement dans les feuilles nommées par des nombres.
    Par baptou42 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/05/2014, 16h40
  3. Remplacement des espaces dans les valeur d'un tableau
    Par calimero642 dans le forum Langage
    Réponses: 10
    Dernier message: 12/05/2006, 18h56

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