[PHP] Expression regulière: supprimer les virgules entre parenthèses

Expression regulière: supprimer les virgules entre parenthèses [PHP] - PHP - Programmation

Marsh Posté le 24-05-2011 à 17:15:13    

Bonjour à tous et à toutes,
 
 
Jme tire le peu de cheveux qui me reste depuis tout à l'heure sur l'expression régulière qui me  
permettrait de remplacer toutes les occurrences de virgules ',' qui se trouvent entre parenthèses closes.  
 
Par exemple remplacer  
"mot1, (mot2, mot3, mot4), (mot5, mot6, mot7, mot8), mot9" par  
"mot1, (mot2- mot3- mot4), (mot5- mot6- mot7- mot8), mot9".
 
Voilà où j'en suis, mais sans succès :sweat:. Je penche pour de la récursion (\R)  :??: ?:  

Code :
  1. $str="mot1, (mot2, mot3, mot4), (mot5, mot6, mot7, mot8), mot9"
  2. preg_match("#\([^,]*),([^,]*)\)#", "($1-$2), $str);


 
merci.
 :jap:


Message édité par ksss le 24-05-2011 à 17:32:58
Reply

Marsh Posté le 24-05-2011 à 17:15:13   

Reply

Marsh Posté le 24-05-2011 à 17:36:29    

Salut, j'y suis arrivé en deux fois, je te drop ça ;)
 
C'est un peut barbare je te le concède mais j'ai pas le temps d'optimiser la chose.
Première chose, voici le regex que j'ai utilisé pour capturer les "paquets": #(\w+), \((.+)\), \((.+)\), (\w+)#i
Pour avoir un aperçu je te propose de jeter un œil sur ce Regex Tester.
 
Le reste du traitement est on ne peut plus basique, si ce n'est que j'ai scindé le tout pour une manière compréhension.

Code :
  1. <?php
  2. $subject = "mot1, (mot2, mot3, mot4), (mot5, mot6, mot7, mot8), mot9";
  3. $pattern = "#(\w+), \((.+)\), \((.+)\), (\w+)#i";
  4. preg_match($pattern, $subject, $matches);
  5. $string = $matches;
  6. $replacement = "-";
  7. $string = preg_replace("#,#", $replacement, $string);
  8. $replacement = "$string[1], ($string[2]), ($string[3]), $string[4]";
  9. $result = preg_replace($pattern, $replacement, $subject);
  10. echo $result;
  11. ?>


 
Ce n'est pas parfait, mais si tu as des questions, n'hésites pas ;)


Message édité par Fk01 le 24-05-2011 à 18:18:51
Reply

Marsh Posté le 25-05-2011 à 00:02:42    

Salut,
 
Tout d'abord merci pour ta considération.
 
Concernant ta réponse, à moins que je ne me trompe, elle ne gère que la forme qui est celle de l'exemple donné hors celui-ci n'est en fait qu'un exemple.  
La chaine de caractère peut prendre la forme (mot1, mot2) mot3 mot4 (mot5), mot6, (mot7 mot8) et ainsi de suite. Il n'y a pas de format précis dans la répartition des parenthèses.
 
Après j'avais pensé à une forme en plusieurs étapes comme ce que tu proposes et le pattern pour extraire les contenus entre parenthèse était genre : "#\(([^\)])\)#i", puis faire un str_replace mais je cherchais quelque chose de plus harmonieux et léger en consommation (c'est pour du parsing de gros fichier....
 
Merci.

Reply

Marsh Posté le 25-05-2011 à 00:34:51    

Ha ok, désolé je n'avais pas bien saisi l'idée, autant pour moi.
Je regarde ça dès que j'ai une minute ;)

Reply

Marsh Posté le 25-05-2011 à 14:07:15    

Ton problème est que les regexp sont par défaut gloutonnes (greedy), tu dois donc forcer ta regexp en ungreedy avec le modifier 'U'
 
preg_replace('`maregexpdeouf`Usi',  
 
U -> Ungreedy
s -> multiline
i -> case insensitive


Message édité par CyberDenix le 25-05-2011 à 14:08:58

---------------
Directeur Technique (CTO)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed