Page 1 sur 1

expression régulière et décimales

Posté : 12 mai 2009, 16:42
par Invité
Bonjour à tous,
j'ai des valeur décimales dans une chaine sous la forme:
0.52
1.27
15.00
35.01

Je vous drais avec une expression régulière, touver toutes les valeurs décimales et leur ajouter le signe € juste derrière, de manière à obtenir:
0.52 €
1.27 €
15.00 €
35.01 €

J'ai tenté le code suivant:
preg_replace('#^([0-9])+\.([0-9])+$#', '$1 €', $description);
Il en se passe rien...quelqu'un voit-il ce qu je fais mal?
Merci pour vos réponses.

Posté : 12 mai 2009, 17:16
par Invité
ok, il me manquait les parenthèses pour créer une variable $1 avec la valeur recherchée.

Ceci fonctionne presque bien:
preg_replace('#([0-9][0-9].[0-9][0-9])#', '$1 €', $description);
ça me transforme 15.26 en 15.26 €.
Mon problème: l'expression régulière ne transforme pas les décimales de la forme:
1.25
ou
1.1
25.6

car il n'y a pas deux chiffres de chaque côté du point...

Posté : 12 mai 2009, 17:16
par sadeq
L'expression est la suivante:
// Modifier la description en ajoutant € après un nombre décimal
$description = preg_replace('#^(\d*[.,]?\d*)$#', '$1 €', $description);
Le nombre décimal est de la forme : (\d*[.,]?\d*)
\d désigne un chiffre de 0 à 9
et * désigne N répétitions de chiffres.
Donc la forme \d* désigne un nombre constitué de N chiffres

et finalement [.,] est mise entre deux nombre et signifie un séparateur de décimaux pouvant être le . (point) ou la , (virgule)
On a ajouté un ? après, pour signifier que ce séparateur est facultatif et ainsi traiter aussi les nombre qui n'ont pas de partie décimale.

Posté : 12 mai 2009, 17:18
par Invité
ach, on a du poster en meme temps. c'est paaarfait merci beaucoup!

Posté : 12 mai 2009, 17:32
par Invité
petite question: comment intégrer une prise en compote des entiens dans ta solution, en plus des décimales pour dire "trouver tous les entiers ou toutes les décimales"

Posté : 12 mai 2009, 17:37
par Invité
pardon, entiers ET décimales pas OU

Posté : 12 mai 2009, 18:31
par Ryle
On a ajouté un ? après, pour signifier que ce séparateur est facultatif et ainsi traiter aussi les nombre qui n'ont pas de partie décimale.
:-*

Posté : 12 mai 2009, 19:25
par Invité
merci! j'ai un autre pb.
j'ai une liste comme d'éléments comme ceci:

voiture(opel): 2000
soutien-gorge(90B):
vélo(rouge): 3
avion(f11):

je voudrais remplacer a jouter 0 € après : s'il ny a rien. dans mon exemple, ça revient à faire un pattern qui remplace

soutien-gorge(90B):
par
soutien-gorge(90B): 0€

et

avion(f11):
par
avion(f11): 0€

pour cela j'ai tenté ceci:
 preg_replace('#(\):[^0-9a-z])$#', '$1 0 €', $description);
tout ça pour dire: "si tu trouves ) suivi de : et que juste après il n'y a pas de caractères alphanumériques, ajoute 0 € à la suite.

ça ne marche pas, mais pas d'erreur. voyez vous pourquoi?

Posté : 12 mai 2009, 20:31
par sadeq
Tu fais:
preg_replace('#(.*:)\s*$#', '$1 0 €', $description); 
le filtre (.*:)$ cherche le texte qui se termine forcement par : (deux-points) plus ou moins suivis d'espaces et donc, où il n'y a pas de données après les : (deux-points)

Posté : 12 mai 2009, 20:58
par Invité
ça n'a pas marché cette fois. exemple concret:
je dois transformer:

Total photos numériques(0,90€/photo):

en

Total photos numériques(0,90€/photo): 0 €

Aucune erreur mais pas de résultat non plus

Posté : 12 mai 2009, 21:23
par sadeq
Désolé, je ne poste jamais sans tester, et ceci marche:
<?php
$description = "Total photos numériques(0,90€/photo):";
echo preg_replace('#(.*:)\s*$#', '$1 0 €', $description); 
?>

Posté : 13 mai 2009, 00:42
par Invité
ya til un caractère pour désigner "rien" dans une expression régulière?

Posté : 13 mai 2009, 08:56
par sadeq
Oui: ^(.{0})$ ça veut dire rien car elle cherche {0} fois un caractère quelconque désigné par (.)