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 23/02/2008, 19h43   #1
Membre actif
 
Avatar de MicaelFelix
 
Myka
Étudiant
Inscription : juillet 2006
Messages : 254
Détails du profil
Informations personnelles :
Nom : Myka
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 254
Points : 153
Points : 153
Par défaut Validation de caractères

Bonjour,

Aujourd'hui on m'a posé une bonne question sur comment utiliser le preg_match correctement pour valider un nom sur un site web (username).
Moi j'aimerai faire un code qui détecte si la chaine contient :
- Au moins 3 caractères
- Suivis de
- caractères de a à z (insensible à la casse)
OU
- des nombres de de 1 à 9


Ça m'a pas l'air bien compliqué mais pourtant... ça fonctionne pas.

Voici le code ci dessous.

Code :
1
2
3
4
5
6
7
8
9
10
<?php
	$var = preg_match("(...([a-z]|[1-9])*)","----");
 
	if($var>0)
		echo("ok trouvé");
	else
		echo("pas trouvé");
 
	echo("<br>$var");
?>
Ça ne devrait pas fonctionner et pourtant... ça fonctionne... il renvoie 1 comme si c'était bon.
On dirait que c'est bon il vérifie si il y a trois caractères, mais ensuite tous les autres caractères passent.

Je ne comprends pas

Et puis j'avais testé : quelle est la différence entre :
([a-z]) et [a-z] ?
Moi je n'en voit aucune, pourtant l'un renvoie 1 et l'autre 0 malgré la même chaine passée en paramètre! Les () sont nécessaires pour l'évaluation avec preg_replace ?

Quelqu'un pourrait m'aider?
MicaelFelix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 21h08   #2
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Bonsoir,
que voulez-vous comme restriction?

Expliquez plus clairement, en donnant plusieurs exemple de ce que vous voulez et ne voulez pas.

Cordialement,
DaRiaN.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 22h11   #3
Membre expérimenté
 
Avatar de neilbgr
 
Inscription : août 2004
Messages : 584
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 584
Points : 589
Points : 589
Effectivement, il renvoie une correspondance, car il manque le début et fin de ligne.
Soit :
__________________
"Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
"Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
"Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry
neilbgr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 22h18   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
et aussi parce que ([a-z]|[1-9])* veut dire "des chiffres, des lettres ou rien du tout". Le + serait préférable à l'étoile dans ce cas...
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 01h04   #5
Membre actif
 
Avatar de MicaelFelix
 
Myka
Étudiant
Inscription : juillet 2006
Messages : 254
Détails du profil
Informations personnelles :
Nom : Myka
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 254
Points : 153
Points : 153
Citation:
Envoyé par neilbgr Voir le message
Effectivement, il renvoie une correspondance, car il manque le début et fin de ligne.
Merci !!!

C'est exact, en fait je viens de comprendre, c'est que comme je n'avais pas fixé le début ni la fin, ben il trouvait un caractère qui correspondait et pouvait s'arrêter avec une correspondance.

Voici mon code modifié :

Code :
1
2
$chainetestee = "abc14w";
preg_match("(^([a-z]|[1-9])([a-z]|[1-9])([a-z]|[1-9])([a-z]|[1-9])*$)",$chainetestee);
Et ça fonctionne impecc. Avant j'avais "..." mais c'était pas bon parce que ça représentait n'importe quel caractère.

Y'a-t-il une solution plus optimisée?

Parce que j'utilise ([a-z]|[1-9]) quatre fois dans l'expression.
Peut-on faire mieux ?
MicaelFelix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 01h56   #6
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Y a toujours moyen de faire plus court, mais plus optimisé, aucune idée :

Code :
$pattern = '`^([[:alnum:]]{4,})$`';
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 15h02   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Les [classes de caractères] sont plus efficaces que les (alter|natives).

Sinon, attention, [:alnum:] prendra le 0. J'adapterais ainsi :

Code :
$pattern = '`^([a-z1-9]{4,})$`';
ou
Code :
$pattern = '`^([a-z1-9]{4,})$`i';
pour ignorer la casse.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 15h26   #8
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Oula... je devais être fatigué hier, désolé. Par contre dans ce cas, adieu les caractères accentués (je ne sais pas s'il en a besoin) et tout ça pour un zéro qu'on pourrait facilement retrouver avec un strpos.

Allez, une dernière possibilité?

Code :
$pattern = '`^([A-z1-9]{4,})$`';
Pour l'autre cas de figure, peut-être :

Code :
$pattern = '`^(([[:alpha:]]|[1-9]){4,})$`';
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 15h47   #9
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
ou même :

Code :
$pattern = '`^([[:alpha:]1-9]{4,})$`';
Mais je croyais que [:alpha:] et [:alnum:] ne prenait les accents que quand il y avait une locale ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 16h51   #10
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Je ne sais pas, je travaille rarement avec les REGEX. Il faudra surement rajouter ce genre de code en début de script, tout dépendra du serveur et de sa configuration.

Code :
  setlocale(LC_ALL, 'fr_FR.ISO-8859-1');
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 17h55   #11
Membre actif
 
Avatar de MicaelFelix
 
Myka
Étudiant
Inscription : juillet 2006
Messages : 254
Détails du profil
Informations personnelles :
Nom : Myka
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 254
Points : 153
Points : 153
Ok parfait sauf qu'on m'a pas expliqué la différence avec et sans () pourquoi j'obtenais des résultats différents. Bof en tous cas c'est pas si grave, peut être que j'avais fait une autre erreur.

En tous cas, merci à tous, votre aide a été précieuse
MicaelFelix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 23h23   #12
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
T'avais dû faire une autre erreur
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 03h36.


 
 
 
 
Partenaires

Hébergement Web