web-dev-qa-db-fra.com

Créer preg_match pour la validation du mot de passe permettant (! @ # $%)

J'aimerais créer une fonction preg_match pour valider mes mots de passe, mais je ne sais pas comment l'écrire pour autoriser l'utilisation des caractères spéciaux suivants: !@#$%.

if(!preg_match(?????)$/', $password))

Voici les règles de mon mot de passe que je veux intégrer dans la regex:

  • Peut contenir des lettres et des chiffres
  • Doit contenir au moins 1 chiffre et 1 lettre
  • Peut contenir l'un des caractères suivants: !@#$%
  • Doit être 8-12 caractères

Merci pour toute aide que vous pouvez offrir.

9
Mark Rummel

Je pense que cela devrait ressembler à ça:

if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,12}$/', $password)) {
    echo 'the password does not meet the requirements!';
}

Entre début -> ^
Et fin -> $
de la chaîne il doit y avoir au moins un nombre -> (?=.*\d)
et au moins une lettre -> (?=.*[A-Za-z])
et il doit s'agir d'un chiffre, d'une lettre ou d'un des éléments suivants:! @ # $% -> [0-9A-Za-z!@#$%]
et il doit y avoir 8-12 caractères -> {8,12}

Comme user557846 a commenté votre question, je vous suggère également d'autoriser plus de caractères. En général (si j'utilise un maximum), je prends au moins 50 :)

au fait, vous voudrez peut-être jeter un oeil à ce tutoriel sur les expressions régulières

47
r3bel
preg_match('/^(?=.*\d)(?=.*[@#\-_$%^&+=§!\?])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z@#\-_$%^&+=§!\?]{8,20}$/',$password)
  • au moins un caractère minuscule
  • au moins un caractère majuscule
  • au moins un chiffre
  • au moins un signe spécial de @ # -_ $% ^ & + = § !?
8
Thomas

J'aimais la réponse de r3bel, alors je me suis amusée avec elle et j'ai fini par utiliser la fonction suivante de vérification du mot de passe:

function password_strength_check($password, $min_len = 8, $max_len = 70, $req_digit = 1, $req_lower = 1, $req_upper = 1, $req_symbol = 1) {
    // Build regex string depending on requirements for the password
    $regex = '/^';
    if ($req_digit == 1) { $regex .= '(?=.*\d)'; }              // Match at least 1 digit
    if ($req_lower == 1) { $regex .= '(?=.*[a-z])'; }           // Match at least 1 lowercase letter
    if ($req_upper == 1) { $regex .= '(?=.*[A-Z])'; }           // Match at least 1 uppercase letter
    if ($req_symbol == 1) { $regex .= '(?=.*[^a-zA-Z\d])'; }    // Match at least 1 character that is none of the above
    $regex .= '.{' . $min_len . ',' . $max_len . '}$/';

    if(preg_match($regex, $password)) {
        return TRUE;
    } else {
        return FALSE;
    }
}

Les longueurs Max/Min sont par défaut ou ajustables, chaque exigence est activée par défaut, mais peut être désactivée, et je voulais prendre en charge tous les symboles. ensemble de symboles.

2
David Bell

J'ai développé une regex complète pour un contrôle un peu plus complexe

/^(?=.*\d)(?=.*[A-Za-z])(?=.*[A-Z])(?=.*[a-z])(?=.*[ !#$%&'\(\) * +,-.\/[\\] ^ _`{|}~\"])[0-9A-Za-z !#$%&'\(\) * +,-.\/[\\] ^ _`{|}~\"]{8,50}$/

En gros, je vérifie que le mot de passe a 1 chiffre, 1 caractère majuscule, 1 caractère inférieur et 1 caractère spécial. J'espère que cela aide quelqu'un à la recherche d'un regex.

1
Morpheus_ro

C'est ce que j'ai fait avec mon formulaire personnalisé Drupal dans hook_form_validate. Le mot de passe doit comporter 6 caractères de lettres, chiffres et au moins un caractère spécial.

<?
if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])(?=.*[!@#$%])[0-9A-Za-z!@#$%]{6,15}$/', $form_state['values']['pass'])) {
    form_set_error('pass', t('Password must contain 6 characters of letters, numbers and at least one special character.'));
}
?>
0
Rishi Kulshreshtha

D'une manière différente

Que ce soit différent, je pense que les utilisateurs peuvent utiliser tous les caractères _SCII valides (32 < ascii_code < 127) du mot de passe et créé une fonction vérifiant tous les caractères présents dans la table ASCII!

function check($pass, $i = 0){
     if(strlen($pass) > $i)
         return (0rd(pass[$i]) > 32 and 0rd(pass[$i]) < 127) and check($pass, $i + 1);
}

Usage

if(!check($_POST["password"])){
    echo "password is wrong";
}
0
Amir Forsati
if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])(?=.*[!@#$%])[0-9A-Za-z!@#$%]
{6,15}$/',($_POST['password']))) {
    $message='Password must contain 6 characters of letters, numbers and 
    at least one special character.';
}
0
bhupinder singh