8791 sujets

Développement web côté serveur, CMS

Bonjour, j'ai un problème avec les expressions régulières.

Après que l'utilisateur ait rempli un formulaire d'enregistrement, je vérifie via php et les expressions régulières qu'il n'ait pas rempli les champs de manière erronée. Pour tous mes champs j'ai trouvé l'expression exacte que je cherchais, mais j'ai un soucis pour le mot de passe.

voici l'expression (de type 'ereg'):

^.*[[:alpha:]].*[[:digit:]].*$|^.*[[:digit:]].*[[:alpha:]].*$


Avec cette expression, le php vérifie qu'il y ait bien au moins une lettre et un chiffre dans le mot de passe, c'est l'effet recherché. Cependant, je souhaites que l'utilisateur ne puisse pas entrer moins de 6 caractères divers, hors avec cette expression, il peut très bien n'en rentrer que deux.

Que dois-je faire ? J'ai plusieurs questions:
- y a t-il un meilleur moyen d'imposer la présence de deux caractères non successifs dans une seule expression régulière ?
- serais t-il préférable que je passe par deux expressions régulières ? if (exp1 && exp2) ?
- peut on définir un nombre de caractère minimal à un ensemble d'expressions régulières ? Par exemple, j'aimerais pouvoir imposer un nombre minimum de caractères à x et y sans définir la longueur de x et de y, quelquechose qui serait comme ceci: '(x*y*){4,}' ? (et "xyyy" ou "xxxy" ou encore "xxxx" seraient valides mais pas "xxy")

Merci de vos réponses, je cherche peut être trop compliqué alors que faire deux expressions régulières me semble tellement simple, mais on me l'a déconseillé alors j'essaye de trouver une alternative.
Modifié par circle (02 Aug 2008 - 23:55)
Dans un premier temps, tu peux vérifier la longueur du mot de passe grâce à strlen() et s'il est trop court, interrompre là le processus.
Ensuite, pour vérifier qu'une occurence apparait au moins une fois, il ne faut pas utiliser l'astérisque (pour 0, 1 ou plusieurs) mait le plus (pas *, mais +)
Pour le reste, je suis un peu rouillé, mais il me semble que ton masque ne cherchera que des chaines dont la première partie est d'un type (alpha ou digit) et la seconde de l'autre.

Plus d'infos http://www.expreg.com/
superjun a écrit :
Dans un premier temps, tu peux vérifier la longueur du mot de passe grâce à strlen() et s'il est trop court, interrompre là le processus.
Ensuite, pour vérifier qu'une occurence apparait au moins une fois, il ne faut pas utiliser l'astérisque (pour 0, 1 ou plusieurs) mait le plus (pas *, mais +)
Pour le reste, je suis un peu rouillé, mais il me semble que ton masque ne cherchera que des chaines dont la première partie est d'un type (alpha ou digit) et la seconde de l'autre.

Plus d'infos http://www.expreg.com/



Pour le "plus" et l'astérisque, je savais que ça fonctionait comme cela, mais c'est ce que je veux,

je m'explique:
prenons l'exemple d'une personne qui entre un tel code: "<<<<6a" (que je considère valide)
si je remplace les * par des +, les patrons seront alors les suivants: _a_1_ ou _1_a_ (considérer "_" comme remplaçant n'importe quel caractère) hors le code entré ne correspond plus aux patrons, en effet, il manque alors deux conditions pour ce patron:

Base: <<<<6a = ____1a
Essai patron 1: ____1a != _1_a[b]_[/b] : la chaîne fini bien par un caractère quelconque, mais dans ce cas, le "a" est mangé, on obtient donc: ____1_
Essai patron 2: ____1a != _1[b]_[/b]a_ : la chaîne contient bien une lettre ET un chiffre MAIS elles ne sont pas séparées par un caractère quelconque.


Il y a d'autres exemples qui ne fonctionnerait pas: 1<<<<a, 1a<<<<, <<a1<<, a<1<<< et tous leurs frères et soeurs.
Voilà pourquoi j'ai choisi les * au lieu des +.

Quant à mon masque il cherche si il y a des caractères quelconques ou pas, suivi d'une lettre puis d'un chiffre séparé par un nombre indéterminé de caractères quelconques (qui peut être 0), lui suivi d'un nombre indéterminé également de caractères quelconques ou pas. Si il ne trouve pas ce patron (c'est à dire quelquechose du genre _____a______1_____), il cherche si il trouve l'inverse (c'est à dire quelquechose du genre ___1__a___ ...).

Sinon, je vais aller voir strlen(), je pense que c'est exactement ce qu'il me faut, je pensais pouvoir m'en tirer seulement avec une expression régulière, mais ça fera parfaitement l'affaire.

J'essaye ça dans la soirée ou demain et je vous tiens au courant, merci pour vos réponses !