对于政府主要承包商,希望根据其要求应用密码正则表达式:
具有以下代码:
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;
}
我想问两件事:
\x21-\x7E
是在表达式的两个部分中都使用php regex正确地定义了ascii的含义(有关这两个部分的含义,请参见#2)。[0-9A-Za-z\x21-\x7E]
的这一部分在做什么,(?=.*\d)(?=.*[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])
这部分还没有做什么?它似乎工作正常,但我不知道我是否缺少任何东西。我能说的最好是说它必须至少包含: 1个大写 -1个小写 -1个号码 -1个特殊字符(空格除外),以及 -必须是字母,数字和特殊字符(但是我觉得这很多余)
答案 0 :(得分: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个字符。