web-dev-qa-db-fra.com

Comment vérifier si la chaîne a au moins une lettre, un chiffre et un caractère spécial en php

J'écris actuellement un petit script qui vérifie le contenu de chaque chaîne.

Je me demandais ce que serait le REGEX pour s'assurer qu'une chaîne a une lettre (supérieure ou inférieure), un chiffre et un caractère spécial?

Voici ce que je sais jusqu'à présent (ce qui n'est pas grand-chose):

if(preg_match('/^[a-zA-Z0-9]+$/i', $string)):

L'aide serait géniale!

Merci!

15
Peter Stuart

Le moyen le plus simple (et probablement le meilleur) consiste à effectuer trois vérifications distinctes avec preg_match:

$containsLetter  = preg_match('/[a-zA-Z]/',    $string);
$containsDigit   = preg_match('/\d/',          $string);
$containsSpecial = preg_match('/[^a-zA-Z\d]/', $string);

// $containsAll = $containsLetter && $containsDigit && $containsSpecial
48
Ry-

Vous pouvez utiliser positive lookahead pour créer une seule expression régulière:

$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/');
//                                              special characters  ^^^^
11
Igor Korkhov

J'ai trouvé une excellente réponse ici avec des explications pour m'assurer qu'une chaîne donnée contient au moins un caractère de chacune des catégories suivantes.

Caractère minuscule, caractère majuscule, chiffre, symbole

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$

Une brève explication:

^ // le début de la chaîne

(?=.*[a-z]) // utilise une perspective positive pour voir s'il existe au moins une lettre minuscule

(?=.*[A-Z]) // utilise une perspective positive pour voir s'il existe au moins une lettre majuscule

(?=.*\d) // utilise une perspective positive pour voir s'il existe au moins un chiffre

(?=.*[_\W]) // utilise une perspective positive pour voir s'il existe au moins un caractère de soulignement ou non Word

.+ // engloutit toute la chaîne

$ // la fin de la chaîne

J'espère que cela vous aidera.

9
Emad Samir Zaki

Il peut être préférable d'utiliser 3 expressions régulières distinctes pour ce faire, car vous devrez faire correspondre 6 possibilités différentes, selon l'emplacement de vos caractères spéciaux dans votre chaîne. Mais si vous voulez le faire en une seule expression régulière, et que vos caractères spéciaux sont, par exemple, [+? @], Il est possible:

$string = "abc@123";
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/"
if (preg_match($regex, $string)) {
   // special characters
}
4
arc

Une lettre est \pL, un nombre est \pN et un caractère spécial est [what you want], ici je suppose que ce n'est pas une lettre et pas un chiffre, donc l'expression régulière ressemble à:

/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/
3
Toto

Faux (réponse choisie ci-dessus - Merci!) Avait un moyen assez simple d'envelopper votre tête (si vous n'êtes pas trop familier avec l'expression régulière) et de trouver ce qui fonctionne pour vous.

Je viens de mettre ceci pour élaborer un peu:

(vous pouvez le coller sur http://phptester.net/index.php?lang=en pour travailler avec)

<?php

$pass="abc1A";

$ucl = preg_match('/[A-Z]/', $pass); // Uppercase Letter
$lcl = preg_match('/[a-z]/', $pass); // Lowercase Letter
$Dig = preg_match('/\d/', $pass); // Numeral
$nos = preg_match('/\W/', $pass); // Non-alpha/num characters (allows underscore)

if($ucl) {
    echo "Contains upper case!<br>";
}

if($lcl) {
    echo "Contains lower case!<br>";
}

if($Dig) {
    echo "Contains a numeral!<br>";
}

// I negated this if you want to dis-allow non-alphas/num:
if(!$nos) {
    echo "Contains no Symbols!<br>"; 
}

if ($ucl && $lcl && $Dig && !$nos) { // Negated on $nos here as well
    echo "<br>All Four Pass!!!";
} else {
    echo "<br>Failure...";
}

?>
2
Scott Hallett