对于政府主要承包商,希望根据他们的要求应用密码正则表达式:
- 至少一个大写字母
- 至少一个小写字母
- 至少一个数字
- 至少一个特殊字符
有以下代码:
if(empty(trim($_POST["password"]))) {
$passwordErr = "Please enter a password.";
} elseif(trim($_POST["password"]) === $username) {
$passwordErr = "Cannot be the same as your username";
} elseif(trim_check($_POST["password"]) == TRUE) {
$passwordErr = "Please do not use a space in your password.";
} elseif(!preg_match('/^(?=.*\d)(?=.*[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z\x21-\x7E]{6,50}$/',($_POST['password']))) {
$passwordErr = "Must be six to fifty characters in length and at least one of each: <ul><li><strong>Uppercase</strong></li><li><strong>Lowercase</strong></li><li><strong>Number</strong></li><li><strong>Special Character</strong></li></ul>";
} else {
$password = trim($_POST['password']);
}
传递给它的函数仅在确保没有空格之前修剪空格:
function trim_check($data) {
$data = trim($data);
$data = preg_match('/\s/',($data));
return $data;
}
我想请教两件事:
- 是否在表达式的两个部分中使用 php regex for ascii 正确定义了
\x21-\x7E
(有关这两个部分的含义,请参阅#2)。 - 表达式
[0-9A-Za-z\x21-\x7E]
的这部分内容是什么(?=.*\d)(?=. *[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])
还没有在做什么?
看起来工作正常,但我不知道我是否遗漏了一些东西。我能说的最多的是它必须至少包含: 1 大写 - 1 个小写字母 - 1 个号码 - 1 个特殊字符(空格除外),以及 - 必须是字母、数字和特殊字符(但我觉得这是多余的)
最佳答案
这是您当前的正则表达式,为了可读性分为多行:
^
(?=.*\d) \
(?=.*[\x21-\x7E]) \
(?=.*[a-z]) / assert some conditions
(?=.*[A-Z]) /
[0-9A-Za-z\x21-\x7E]{6,50} -- match here
$
前四个正向先行断言数字、特殊字符、小写和大写字母在模式中出现一次或多次。但问题是,先行断言但实际上并不匹配或消耗任何东西。因此,正则表达式的最后部分执行以下操作:
[0-9A-Za-z\x21-\x7E]{6,50}
请注意,上述内容也仅限于上述类型的字符,并且仅允许 6 到 50 个字符。
关于php - 密码正则表达式政府要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55699165/