我目前正在使用正则表达式进行一些测试。我有一个练习,要求检查一个强密码,这意味着它应该有:至少一个数字,一个小写字母,一个大写字母,没有空格,至少一个 字母不是字母或数字。它应该在8-16个字符之间。
我写了这段代码:
<?php
$passwords = array("Jtuhn", "12J@k", "jok", "Joan 12@45", "Jghf2@45", "Joan=?j123j");
foreach($passwords as $pass)
{
///^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$/
if(strlen($pass) >= 8 && strlen($pass) < 17)
{
if(preg_match("/^\w*(?=\w*\d)(?=\w*[A-Z])(?=\w*[^0-9A-Za-z])(?=\w*[a-z])\w*$/", $pass) )
echo "$pass => MATCH<br>";
else
echo "$pass => FAIL<br>";
}
else
echo "$pass => FAIL(because of length)<br>";
}
?>
最后两个应该匹配,但它们会失败。我认为问题出在
(?=\w*[^0-9A-Za-z])
这应该是模式匹配,至少有一个字母不是字母或数字,但我无法弄清楚原因。 我知道这个强密码是在互联网上解决的,但这不是我的问题。我的问题是为什么这部分工作不应该做的事情。
答案 0 :(得分:8)
您可以将正则表达式拆分为不同的检查。
它允许您编写更易读的条件并显示特定的错误消息。虽然,正则表达式模式更容易编写和理解。
即。 :
$errors = array();
if (strlen($pass) < 8 || strlen($pass) > 16) {
$errors[] = "Password should be min 8 characters and max 16 characters";
}
if (!preg_match("/\d/", $pass)) {
$errors[] = "Password should contain at least one digit";
}
if (!preg_match("/[A-Z]/", $pass)) {
$errors[] = "Password should contain at least one Capital Letter";
}
if (!preg_match("/[a-z]/", $pass)) {
$errors[] = "Password should contain at least one small Letter";
}
if (!preg_match("/\W/", $pass)) {
$errors[] = "Password should contain at least one special character";
}
if (preg_match("/\s/", $pass)) {
$errors[] = "Password should not contain any white space";
}
if ($errors) {
foreach ($errors as $error) {
echo $error . "\n";
}
die();
} else {
echo "$pass => MATCH\n";
}
希望它有所帮助。
答案 1 :(得分:4)
你可以试试这个:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,16}$
它涵盖了您的所有要求
(?=.*\d)
至少数字(?=.*[a-z])
至少小写字母(?=.*[A-Z])
至少是一个大写字母(?!.* )
没有空间(?=.*[^a-zA-Z0-9])
至少包含a-zA-Z0-9
.{8,16}
介于8到16个字符之间示例代码:
<?php
$re = '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,16}$/m';
$str = 'Jtuhn
12J@k
jok
Joan 12@45
Jghf2@45
Joan=?j123j
';
preg_match_all($re, $str, $matches);
print_r($matches);
?>
答案 2 :(得分:1)
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}\S+$
//The rule is at least
one upper case, one lower case, one digit[0-9],
one special character[#?!@$%^&*-] and the minimum length should be 8.
答案 3 :(得分:0)
使用此简单的正则表达式来测试强密码
/(?=^.{8,}$)(?=.{0,}[A-Z])(?=.{0,}[a-z])(?=.{0,}\W)(?=.{0,}\d)/g
JavaScript:
var password = "Abcdef@1234"
var passwordRegex = /(?=^.{8,}$)(?=.{0,}[A-Z])(?=.{0,}[a-z])(?=.{0,}\W)(?=.{0,}\d)/g
var isStrongPassword = passwordRegex.test(password)
console.log(isStrongPassword, "<Strong password>")