正则表达式用于密码字段验证

时间:2013-04-16 21:18:13

标签: php html regex

对不起,如果这段代码很差,因为我只是通过一本书并为我的学校项目修改它,因为我刚开始使用PHP不到一个月。

我试图理解这个验证意味着什么,但似乎无法完全理解它,因为我是php的新手。

代码:

if (preg_match ('/^(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}$/', $_POST['pass']) ) {

        //$p = mysqli_real_escape_string ($dbc, $_POST['pass']);
        $p = $_POST['pass'];
        $sticky_password = $p;

        } else {
        $error['pass'] = 'Please enter a valid password!';
        }

任何帮助都会非常感激!谢谢!

非常感谢.. :))

2 个答案:

答案 0 :(得分:3)

我们有以下正则表达式: /^(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}$/

  1. 第一个和最后一个/是分隔符。

  2. ^ - >一开始,$ - >结束

    这意味着如果输入为abc且您的正则表达式为/^bc$/,则由于bc不在开头,因此无法匹配。

  3. 现在我们有(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}

    {6,20}是量词部分,表示最多20次。

  4. 让我们进一步打破正则表达式:\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*

    让我们提供一些等价物:

    1. \w => [A-ZA-Z0-9 _]
    2. \d => [0-9]
    3. * =>零次或多次
    4. (?=)是一个先行断言。示例/a(?=b)/这将匹配任何“a”后跟“b”

    5. 这些前瞻的目的:

      • (?=\w*\d) =>检查是否有数字
      • (?=\w*[a-z]) =>检查是否有小写字母
      • (?=\w*[A-Z]) =>检查是否有大写字母
      • 我们采取(?=\w*\d)\w*只是作为“解决方法”,以防万一[a-zA-Z0-9 _] *在数字之前
  5. 最后,这个正则表达式确保输入:

    1. 长度为6到20个字符
    2. 有最小值:1个小写,1个大写和1个数字
    3. 允许的字符是字母(大写和小写(a-z,A-Z)),数字和下划线。
    4. 三个有趣的网站www.regexper.comwww.regular-expressions.infowww.regex101.com

      注意:不要限制密码,无论如何都要哈希。看看here或查看SO上的其他问题。

答案 1 :(得分:0)

实际上,此模式匹配所有密码至少包含3个字符(任意顺序的数字,大写和小写),没有长度限制(正则表达式引擎除外)。所有字符必须是单词字符(即:来自班级\w)。

作者的意图可能是将6到20个字符之间的所有密码与至少一个数字,一个大写字母和一个小写字母匹配,如量词和前瞻所示。

简而言之,这种模式是错误的,但可能是针对这种经典的密码验证模式所做的:

^(?=\w*[A-Z])(?=\w*[a-z])(?=\w*\d)\w{6,20}$

或没有多余的\w

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

说明:lookaheads是零宽度断言,它们不消耗字符,它们只是测试。结果每个都是从字符串的开头执行的,因为它们被锚定到^。如果每个前瞻都成功,则始终从字符串的开头测试\w{6,20},以确定它是否仅包含6到20个单词字符。 $表示字符串的结尾。

正如评论中所述,这种模式来自Larry Ullman的“Effortless E-commerce”第一版

即使作者写道:

  

“而且,诚然,即使我经常需要查找模式的正确语法,但这需要高水平的正则表达式专业知识。”

即使我不同意句子的第二部分,我认为这种模式是一个简单的错字。但是我不知道第二版是否已经纠正了这个问题。