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 14/09/2011, 17h59   #1
Invité de passage
 
Inscription : juillet 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 18
Points : 4
Points : 4
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 :
Citation:
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 :
Citation:
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 :
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
tete-jaune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 20h00   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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 Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 08h53   #3
Invité de passage
 
Inscription : juillet 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 18
Points : 4
Points : 4
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...
tete-jaune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h49   #4
Invité de passage
 
Inscription : juillet 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 18
Points : 4
Points : 4
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
tete-jaune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 15h20   #5
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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 :
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)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 09h30   #6
Invité de passage
 
Inscription : juillet 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 18
Points : 4
Points : 4
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.
tete-jaune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 10h04   #7
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Une variante qui peut éventuellement t'intéresser

Code :
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)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h18   #8
Invité de passage
 
Inscription : juillet 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 18
Points : 4
Points : 4
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
tete-jaune est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h55.


 
 
 
 
Partenaires

Hébergement Web