2010-09-16 5 views
1

J'essaie de faire une expression régulière qui va permettre des nombres de 0,01 à 99,99, mais pas 0,0 ou toute valeur nulle (00,00 ou 00,0 ou 0,00 ou 0,0) ou une valeur négative non plus. Je suis venu tout près, mais comme d'habitude quelque chose ne va pas. 0.0 montre comme valide. Pouvez-vous s'il vous plaît m'aider à résoudre ce problème. En outre, vous n'avez pas besoin de garder l'expression que je l'ai fait :)0,01 à 99,99 dans une expression régulière

<?php 
if (preg_match('/^[0-9]{1,2}[\.][0-9]{1,2}$/','0.0')) 
{echo "Valid";}else{echo "Invalid";} 
?> 
+3

Avez-vous des contraintes qui vous oblige à utiliser des expressions régulières pour cela? Il devrait être beaucoup plus efficace de faire 'if ($ num> 0.0 && $ num <= 99.9)' en supposant que $ num est un float – Fanis

+0

Pourquoi ne pas simplement analyser le nombre? – Kobi

+2

Regex n'est pas la réponse à cette question, en montrant une contrainte que vous ne nous avez pas dit – meagar

Répondre

1

Voilà ma tentative:

/^(?=.*[1-9])\d{0,2}(?:\.\d{0,2})?$/ 

Sapin st off, utilisez un look-ahead positif ((?=.*[1-9])) pour vous assurer qu'il y a au moins un "chiffre significatif" dans le désordre entier, échouera pour toutes les formes de 0.0, 00.00 ou autre. La partie suivante \d{0,2} autorise 0, 1 ou 2 chiffres avant la virgule décimale, puis un groupe facultatif (?:)? qui inclut un nombre décimal, suivi de 0, 1 ou 2 chiffres: \.\d{0,2}. Utilisez les ^ et $ pour compléter cette expression en ne faisant correspondre que du début à la fin de la chaîne.

Certaines chaînes de test rapide:

0.0 failed. 
0 failed. 
12 matched. 
123 failed. 
05.00 matched. 
0.01 matched.
4

Pourquoi ne pas

<?php 
$value = '0.0'; 
if ($value > 0 && preg_match('/^[0-9]{1,2}[\.][0-9]{1,2}$/', $value)) { 
    echo "Valid"; 
} else { 
    echo "Invalid"; 
} 

Parfois, une expression régulière n'est pas une solution, mais plutôt un problème ;-).

+1

Ne voulez-vous pas vérifier si la valeur est> 0 avant d'exécuter la regex? De cette façon, si ce n'est pas le cas, il n'y a pas vraiment de raison de lancer l'expression rationnelle ... –

+0

''/^\ d {1,2} \. {D {1,2} $ /'' est équivalent mais est un peu plus lisible. – Archimedix

+0

@premiso: oui, vous avez raison. Changé en conséquence. –

2

Essayez cette expression régulière:

/^(?:0\.(?:0[1-9]|[1-9]\d)|[1-9]\d?\.\d\d)$/ 
+0

Mieux que tout ce que j'avais, mais il n'autorise pas les zéros en tête. – Kobi

+0

@Kobi: Personne n'a dit quoi que ce soit à propos des zéros en tête. Mais il pourrait être ajouté facilement: '/^0 * ...' – Gumbo

+0

Cela semble intelligent. D'une certaine façon j'ai eu la notion que l'OP veut deux chiffres, ce qui a rendu mon regex plus désordonné, mais vous avez raison, il n'est spécifié nulle part ... (peut-être la liste des "valeurs nulles" - "00.00 ou 00.0 ou 0.00 ou 0.0 ") – Kobi

3

Êtes-vous sûr que vous devez le faire dans une expression régulière?

Si vous utilisez une expression régulière parce que vous essayez d'évaluer une chaîne, vous pouvez toujours la convertir en double, puis effectuer une simple comparaison numérique.

<?php 
function test_number($number) 
{ 
    $number = (double) $number; 

    if ($number >= 0.01 && $number <= 99.99) { 
     return true; 
    } else { 
     return false; 
    } 
} 
0

Je vous Asume considérez seulement 1 ou 2 chiffres, suivi d'un point suivi de 2 décimales

Deux solutions:

1) Est-ce un DFA que de traduire que de regex

0\.0[1-9] | 0\.[1-9][0-9] | [1-9][0-9]?\.[0-9][0-9] 

OU

2) accepter un ou deux chiffres, deux décimaux:

[0-9][0-9]?\.[0-9][0-9] 

puis test:

0 < num && num < 100 

:-)

+0

Qu'en est-il de' 0.02' ... '0.09'? – Gumbo

+0

;-) Oui, vous avez bien compris –

0

Une solution simple:

<?php 

    function test($n) { 
       return($n > 0.0 and $n < 99.99); 
     } 

     echo test(85); //output 1(true) 
?> 
Questions connexes