vérifier qu'une chaine ne contient que un ou deux chiffres

Eléphant du PHP | 161 Messages

05 janv. 2006, 19:02

Yop tout le monde,
voila j'ai trop du mal avec les expressions régulieres et ca fait 1 bonne apres midi que je lutte pour faire ca.

Je veux juste vérifier qu'un champ de formulaire saisi ne contient que un ou deux chiffres.
Par exemple:
1, 2, 34, 98, etc...

J'ai commencé en essayant de vérifier s'il y a des chiffres tout cours de la maniere suivante:
preg_match("[:digit:]", '123');
Mais bon la fonction me retourne toujours 0...


Ensuite, j'ai essayé de faire avec ce truc:
preg_match("^[:digit:]+$", 'Voici un test 123 bla12');
pensant que ca voulait dire:
_commencant par un chiffre
_contenant des chiffres
_finissant par un chiffre
Ca m'avait l'air pas mal :)
mais il me sort un warning

Code : Tout sélectionner

Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in C:\Inetpub\wwwroot\BEN\test.php on line 14
Alors que je pensais que le $ annoncais le caractere de fin... :roll:

J'ai aussi essayé avec is_int() mais vu que les données viennent d'un formulaire ca marche pas!

Voila je sais pas trop comment faire, quelqu'un aurait une idée?

Discret
Invité n'ayant pas de compte PHPfrance

05 janv. 2006, 19:23

Bonjour.

Si tu ne te sens pas à l'aise avec les expressions régulières, tu peux très bien utiliser une fonction pour le faire.
function verifier_nombre ($nombre) {
   if (!is_string ($nombre))
      return false;
   if (strlen ($nombre) != 1 and strlen ($nombre) != 2)
      return false;
   $chiffre = array ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
   if (!in_array ($nombre[0], $chiffre))
      return false;
   if (strlen ($nombre) == 2 and !in_array ($nombre[1], $chiffre))
      return false;
   return true;
}

Mammouth du PHP | 19672 Messages

05 janv. 2006, 19:50

Avec une expression régulière, ce n'est quand même pas vraiment très sorcier, mais il faut de l'obstination : pour vérifier qu'un donnée ne contient que 1 ou deux chiffres et rien d'autre voici:
<?php
$chaines = array();
$chaines[] = "12";
$chaines[] = "a2";
$chaines[] = "1z";
$chaines[] = "1234";

$masque = "#^\d{1,2}$#";
foreach($chaines as $chaine)
{
    if(preg_match($masque, $chaine))
    {
        echo("<p>chaine valide</p>\n");
    }
    else
    {
        echo("<p>chaine invalide</p>\n");
    }
}
?>
L'excution de ces ligns va afficher :
chaine valide

chaine invalide

chaine invalide

chaine invalide
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 161 Messages

06 janv. 2006, 11:09

Si tu ne te sens pas à l'aise avec les expressions régulières, tu peux très bien utiliser une fonction pour le faire.
C'est clair merci pour ton coup de main. C'est juste que les regex on l'air bien puissantes (quand on y arrive) et donc que je trouvais que c'était un bon exercice :)
$masque = "#^\d{1,2}$#";
Hmmm alors si je décortique le truc ca veut dire...
"^" commence par
"\d" un caractere numerique
"{1,2}" contient 1 ou 2 caractere
"$" fini par 1 caractere numerique
C'est ca ?

et les "#" je suppose que c'est le delimiter ? Mais ca délimite quoi ? :roll:

Mammouth du PHP | 19672 Messages

06 janv. 2006, 11:13

Les PCRE (Perl Compatible Regular Expression) doivent être entre des délimiteurs : ces délimiturs encadrent l'expression elle-même et si on ajoute des paramètres, on les met juste après le délimiteur de fin.

Pour le reste, tu as parfaitement résumé. :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 161 Messages

06 janv. 2006, 11:21

lol forcément je comprend mieux pourquoi

Code : Tout sélectionner

Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in C:\Inetpub\wwwroot\BEN\test.php on line 14
Merci beaucoup pour votre aide les gars :)