L'ordre de lecture des Regex

Résolu/Fermé
Syrano - 2 nov. 2015 à 15:23
 Syrano - 3 nov. 2015 à 07:18
Bonjour,

Je veux tester la forme d'un mot de passe, un mot de passe valide dois obligatoirement contenir des minuscules, majuscules et numéros à condition que l'ordre n'aura aucune importance.

$regex = '#[A-Z]+[a-z]+[0-9]+[^a-zA-Z0-9]+#';

mon problème est le suivant :

si je respecte l'ordre dans mon mot de passe, Exp : Ab0* --> True mais, bA0* --> False.

Vous ne savais pas comment puis-je indiquer que l'ordre n'es pas important SVP ?


1 réponse

[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 090
Modifié par [Dal] le 2/11/2015 à 18:39
Salut Syrano,

En faisant une succession de 4 classes différentes, tu imposes cet ordre.

Fait une classe au lieu 4, où tu indiques les caractères "autorisés", comme cela :

/^[A-Za-z0-9]+$/

Note que cela ne va pas matcher les caractères accentués (de même que la ponctuation, etc.) et que cela va matcher à partir de 1 caractère, ce qui fait un mot de passe un peu court.

Pour imposer une taille d'au moins 15 caractères et pas de taille maximale, tu ferais ceci :

/^[A-Za-z0-9]{15,}$/

J'ai mis ^ et $ pour indiquer le début et fin en dehors des crochets, car sinon sinon tu indiques que ces caractères littéraux font partie de la classe.


Dal
0
Merci Dal

j'ai déjà exploité cette piste mais là, c'est vrais que l'ordre ne sera d'aucune utilité mais je peux aussi écrire un mot de passe comme aaaaaaaaa ou AAAAAAAAA ou 99999999 et il affichera toujours True car, je crois, qu'il interprète la classe comme cela : accepter tt les Alphanumériques et retourner True si au moins un caractère alphanumérique est détecté.
Donc on va résoudre le problème de l'ordre mais pas celui de valider le mot de passe si et seulement si un mélange de caractère [a-z],[A-Z] et [0-9] est détecté. :-)
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 260
2 nov. 2015 à 19:07
A mon avis ce n'est pas possible avec une seule regex, il faut faire 3 tests successifs.
0
FeelZoR Messages postés 78 Date d'inscription vendredi 30 octobre 2015 Statut Membre Dernière intervention 18 août 2016 4 > Syrano
Modifié par FeelZoR le 2/11/2015 à 19:10
Dans ce cas tu peux faire 3 regex distrinctes, telles que :
$regex1 = '#[A-Z]+#';

$regex2 = '#[a-z]+#';

$regex3 = '#[0-9]+#';


Et ensuite tu vérifies que les 3 regex soient valides, le seul problème est que le mot de passe sera de 3 caractères minimum... et cette technique est un peu lourde, les noms de variable non explicites.. enfin, tu pourrais peut-être trouver mieux.

Bonne soirée :3
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 090
Modifié par [Dal] le 2/11/2015 à 22:18
@FeelZoR et @Flachy Joe on peut faire cela avec une regexp.

@Syrano: Je n'avais pas saisi tes contraintes, qui effectivement semblent logiques.

Pour cumuler les critères, tu dois utiliser les "look-ahead" permis par les regexp compatibles Perl.

/(?=.*[A-Z]+)(?=.*[a-z]+)(?=.*[0-9]+)(?=.{15,})/


?=
permet de "regarder" en avant, en vérifiant que l'expression matche bien, mais sans consommer les caractères.

Du coup, la succession d'expressions est effectivement cumulée.

Dal
0
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 260
2 nov. 2015 à 23:23
Joli !
0