密码正则表达式政府要求

时间:2019-04-16 01:04:33

标签: php mysql regex

对于政府主要承包商,希望根据其要求应用密码正则表达式:

  1. 至少一个大写字母
  2. 至少一个小写字母
  3. 至少一个数字
  4. 至少一个特殊字符

具有以下代码:

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;
}

我想问两件事:

  1. \x21-\x7E是在表达式的两个部分中都使用php regex正确地定义了ascii的含义(有关这两个部分的含义,请参见#2)。
  2. 表达式[0-9A-Za-z\x21-\x7E]的这一部分在做什么,(?=.*\d)(?=.*[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])这部分还没有做什么?

它似乎工作正常,但我不知道我是否缺少任何东西。我能说的最好是说它必须至少包含:  1个大写 -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个字符。