Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 17h26   #1
Invité régulier
 
Inscription : août 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 11
Points : 7
Points : 7
Par défaut Supprimer les virgules entre parenthèses closes

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. Je penche pour de la récursion (\R) ?:

Code :
1
2
3
 
$str="mot1, (mot2, mot3, mot4), (mot5, mot6, mot7, mot8), mot9";
preg_match("#\([^,]*),([^,]*)\)#", "($1-$2), $str);
merci.
kssss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 08h02   #2
Modérateur
 
Avatar de Nesmontou
 
Homme Benjamin PREVOT
Architecte de système d'information
Inscription : septembre 2004
Messages : 1 568
Détails du profil
Informations personnelles :
Nom : Homme Benjamin PREVOT
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Architecte de système d'information
Secteur : Finance

Informations forums :
Inscription : septembre 2004
Messages : 1 568
Points : 2 493
Points : 2 493
Bonjour,

Tu peux essayer ceci
Code :
1
2
3
4
5
6
7
8
9
10
<?php
$subject = 'mot1, (mot2, mot3, mot4), (mot5, mot6, mot7, mot8), mot9';
$pattern = '/\([^\)]+\)/';
 
function replacement($matches) {
	return str_replace(',', '-', $matches[0]);
}
 
echo preg_replace_callback($pattern, 'replacement', $subject);
?>
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

F.A.Q. : Java, PHP, (X)HTML / CSS

N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème
Nesmontou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h00   #3
Invité régulier
 
Inscription : août 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 11
Points : 7
Points : 7
Salut,

Avant tout merci pour ta considération.

Concernant la solution que tu proposes, ça fonctionne dans la plupart des cas sauf s'il y a parenthèses imbriquées (mot1, (mot2, mot3), mot4) qui donnerait (mot1- (mot2- mot3), mot4) mais je ne pense pas que ça puisse se faire sans récursion....

J'avais vu une solution sur le net qui ressemblait à /\([^\)]+|[\R]\)/ sans bien comprendre...
kssss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 16h04   #4
Membre régulier
 
Homme
Développeur Web
Inscription : octobre 2009
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Vietnam

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2009
Messages : 72
Points : 99
Points : 99
Ce lien peut peut-être t'aider à piger la récursivité http://www.skdevelopment.com/php-reg...xpressions.php 5. How to use recursion in regular expressions.
bon courage
matlow est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 09h27   #5
Invité régulier
 
Inscription : août 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 11
Points : 7
Points : 7
Oui, merci, c'est là que j'avais vu ça, je en retrouvais plus le lien.
Je vais re-regarder ça.
kssss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h57   #6
Membre actif
 
Avatar de Causa Sui
 
Inscription : mai 2003
Messages : 133
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 133
Points : 172
Points : 172
Si on suit l'exemple, on peut exprimer simplement ce dont on a besoin: « supprimer toutes les virgules qui ne sont ni précédées ni suivies par une parenthèse ».
Ce qui se traduit très simplement en expression rationnelle :
Code PHP :
1
2
3
$str="mot1, (mot2, mot3, mot4), (mot5, mot6, mot7, mot8), mot9";
echo preg_replace('#(?<!\)),(?! ?\()#',"-",$str);
// Ce qui donne: mot1, (mot2- mot3- mot4), (mot5- mot6- mot7- mot8), mot9
Causa Sui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h00   #7
Membre actif
 
Avatar de Causa Sui
 
Inscription : mai 2003
Messages : 133
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 133
Points : 172
Points : 172
Si jamais tu as besoin de quelque chose de plus élaboré, alors je suggère que tu utilise autre chose que les expressions rationnelles, comme par exemple le tokonizer de PHP…
Causa Sui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h14   #8
Invité régulier
 
Inscription : août 2010
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 11
Points : 7
Points : 7
Salut,

Merci de participer à la discussion.
Effectivement, la chaine de caractère que j'ai mis n'est qu'un exemple etrien ne me garantie qu'il n'y ait pas une partie de phrase qui correspondrait à :
mot1, mot2 (mot4, mot5) mot7, mot8.

Je vais jeter un œil du coté des tokenizer.
kssss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 17h16   #9
Membre régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 55
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2011
Messages : 55
Points : 77
Points : 77
Il est vrai qu'avec des regex il est très difficile (voir peut être impossible?) de gérer des parenthèses, crochets, balises, ou accolades imbriquées. La solution (même si c'est très peu convenable) serait que tu développe ta propre fonction sur l'algo suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Recherche de la première parenthèse avec strpos
Incrémenter une variable ($nb_parentheses)
Faire
Recherche de '(', de ',' ou de ')' qui est le plus proche (attention au cas ou strpos renvoie false)
  Si le premier terme suivant est une ','
    Remplacer par '-' si $nb_parentheses > 0
  Si le premier terme suivant est une '('
    Incrémenter $nb_parentheses
  Si le premier terme suivant est une ')'
    Décrémenter $nb_parentheses
Jusqu'à ce que les trois soit à false
Tu va ainsi avancer petit a petit dans ta String en comptant dans combien de parenthèses imbriquées tu es.

Oublie pas la fonction substr pour regarder quel est le premier caractère recherché suivant.
Pense aussi à incrémenter la variable position lorsque tu trouve une parenthèse sinon au tour suivant, la position du prochain terme sera 0 et la parenthèses sera comptée infiniment
Avalion est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h21.


 
 
 
 
Partenaires

Hébergement Web