problème avec regex simple

VaN
Mammouth du PHP | 1107 Messages

27 nov. 2008, 19:38

Bonjour,

je souhaite à savoir si un string est constitué uniquement de chiffre. j'ai donc essayé la regex suivante :
if(ereg("^[0-9]+$", $_POST['annonce_zipcode']) === true) {
			echo 'CP';
			//$sql .= " AND annonce_zipcode >= '".$_POST['annonce_zipcode']."'";
		}
		else
			echo 'Ville';
mais elle me renvoie Ville, même si je tape un nombre. Une erreur ?

ViPHP
AB
ViPHP | 5818 Messages

27 nov. 2008, 21:38

Utilises preg_match, ereg est déconseillé pour des raisons de performances. Autant prendre de bonnes habitudes.

IL y a un tuto pas mal pour débuter sur le lien suivant http://www.siteduzero.com/tutoriel-3-14 ... e-1-2.html (il contient la réponse à ta question)

Invité
Invité n'ayant pas de compte PHPfrance

27 nov. 2008, 21:40

bonsoir,

extrait du manuel ( http://fr3.php.net/ereg ) :
Valeurs de retour

Retourne la longueur de l'occurrence trouvée si une occurrence a été trouvée dans la chaîne string et FALSE dans le cas contraire ou si une erreur est survenue.
donc en reprenant ton code :
if(ereg("^[0-9]+$", $_POST['annonce_zipcode']) !== FALSE) {
            echo 'CP';
            //$sql .= " AND annonce_zipcode >= '".$_POST['annonce_zipcode']."'";
        }
        else
            echo 'Ville'; 

Rq : les fonctions POSIX ( ereg &Co ... ) ne devraient plus être utilisées.
on utilise plutôt les fonctions PCRE ( preg_match, etc ... )
voir http://lumadis.be/regex/tuto_pcre.php ( le top des tutos )

VaN
Mammouth du PHP | 1107 Messages

28 nov. 2008, 12:33

BOn je viens donc de passer en preg_match plutot que ereg, mais toujours pareil, ça ne me retourne pas le résultat attendu :
if(preg_match("#^[0-9]+$#", $_POST['annonce_zipcode']) !== false) {
			echo 'CP';
			//$sql .= " AND annonce_zipcode >= '".$_POST['annonce_zipcode']."'";
		}
		else
			echo 'Ville';
Lorsque j'écris un nombre, ça me retourne bien "CP". Mais si j'écris une chaine de lettres, il me retourne également CP, et non Ville.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 nov. 2008, 12:40

if(!preg_match("#^[0-9]+$#", $_POST['annonce_zipcode']))
	echo 'Ville';
else
	echo 'CP';

ViPHP
ViPHP | 3607 Messages

28 nov. 2008, 12:57

Et au pire on a un truc déjà tout fait qui s'appel is_numeric() ;)

VaN
Mammouth du PHP | 1107 Messages

28 nov. 2008, 13:21

Effectivement, is_numeric() (plus trim() ) marche bien

Invité
Invité n'ayant pas de compte PHPfrance

28 nov. 2008, 13:37

BOn je viens donc de passer en preg_match plutot que ereg, mais toujours pareil, ça ne me retourne pas le résultat attendu
pour répondre à cette remarque : toutes les commandes ne retournent pas les mêmes valeurs.
et toujours pareil, c'est dans le manuel ;)

extrait du manuel ( http://fr3.php.net/ereg ) :
Valeurs de retour

Retourne la longueur de l'occurrence trouvée si une occurrence a été trouvée dans la chaîne string et FALSE dans le cas contraire ou si une erreur est survenue.
extrait du manuel ( http://fr3.php.net/preg_match ) :
Valeurs de retour

preg_match() retourne le nombre de fois où le masque pattern a été trouvé. Cela peut aller de 0 (pas de solution) à un 1 car preg_match() s'arrête dès qu'elle a trouvé une première solution.
on ne fait donc pas le même test selon la commande utilisée.