preg_match密码验证

时间:2014-10-23 14:18:27

标签: php forms validation passwords preg-match

我想只允许密码:

  1. 包含a-z / A-Z / 0-9

  2. 包含1个字母和1个数字(我测试密码< 8代码中的其他地方)

  3. atm这就是我所拥有的:

    function invalid($pass){
        return (bool) preg_match('Some pattern???', $pass);
    }
    

    我已经找到了答案,但我不知道这些模式是如何运作的。因此,我无法修改包含我的验证需要的某些元素的模式。

    编辑: 我现在有了这个

    function invalid($pass){
            if(preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$", $pass)) {
                return true;
            } else {
                return false;
            }
        }
    

    但它拒绝我输入的每个密码,甚至:Test1234(1个大写,1个小写,1个字母,8个字符)

2 个答案:

答案 0 :(得分:1)

这就是你想要的:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$

这将使密码必须包含至少一个大写字母,一个小写字母和一个数字。

如果你真的只想要一个字母,一个数字,那就取出(?=.*[A-Z])部分。

此外,为了将来参考,请检查this library。 上面的正则表达式来自here.

为了清楚起见,你会在它周围使用斜杠:

preg_match("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$/", $pass)

或者,更详细地说:

$pass = "GoodPassword123";
echo preg_match("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$/", $pass) ? "Password is good" : "Password is bad"; 

答案 1 :(得分:0)

这应该做的工作:

preg_match('/^[a-zA-Z0-9]*([a-zA-Z][0-9]|[0-9][a-zA-Z])[a-zA-Z0-9]*$/', $pass);

一些解释:

^匹配行的开头

[a-zA-Z0-9] *匹配一个任意长度的字符串(可以是一个空字符串),只包含字符a-Z,A-Z,0-9

([a-zA-Z] [0-9] | [0-9] [a-zA-Z])匹配一个字母后跟一个数字或反之亦然

$匹配行尾