Regex mot de passe PHP

Résolu/Fermé
Darikl - 4 nov. 2022 à 09:15
 Darikl - 4 nov. 2022 à 16:24

Bonjour, je suis un peu naze en Regex donc je voudrais si quelqu'un a ça ou sait faire ça une regex qui valide un mot de passe conforme :

- 12 caractères

- au moins une majuscule

- au moins une minuscule

- au moins un caractère spéciale (@€[$]!?_-...)

Pour faire ça j'utiliserai un preg_match()

J'ai ça mais j'ai remarqué que ça n'accepte pas tous les caractères spéciaux comme le _ :

preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).{12,}$#')

Si vous avez des idées ça pourrait m'aider grandement, merci d'avance.

3 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 4 nov. 2022 à 11:00

Bonjour,

Déjà, tu peux construire et tester tes regex ici : https://regex101.com/

Ensuite, niveau pattern, tu pourrais partir sur un truc du genre :

(?=.*[!@#$%^&*-_])(?=.*[0-9])(?=.*[A-Z]).{12,30}

1

Je viens de tester la tienne elle prend bien le _ comme caractère spéciale par contre on peut faire des mots de passes uniquement en majuscule alors qu'il faudrait une minuscule au moins 

0
Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023 592
4 nov. 2022 à 11:03

Bonjour,

Quels sont tes cas de tests ?

Chez moi ces deux chaines matchent bien, je ne vois pas le problème.

rE@1!_8-$1gy
rE@1!#8-$1gy

Je teste ça ici : https://regex101.com/


0

Bonjour, 

je test un mot de passe comme ça Passw0rd261_

qui a tous ce qui faut et ma regex ne match pas alors que si je met ça Passw0rd261- elle va macth ou Passw0rd261! ...

0
Grandasse_ Messages postés 924 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 27 avril 2023 592 > Darikl
Modifié le 4 nov. 2022 à 15:47

Ok j'ai trouvé

Tu as écrit :

preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).{12,}$#')

Alors que tu veux :

preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\w).{12,}$#')

La différence est le \w au lieu du \W sur la fin.

EDIT : et même il te faudrait : 

preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@€\[$\]!?_-]).{12,}$#')
0

La deuxième ne marchait pas mais la troisième correspond parfaitement à ce que je voulais, je te remercie pour la solution.

Cdt,

Darikl

0