2

对不起,如果这段代码很糟糕,因为我只是在不到一个月前开始使用 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!';
        }

任何帮助将非常感激!谢谢!

非常感谢你.. :)

4

2 回答 2

3

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

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

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

    这意味着如果 input isabc并且您的正则表达式 is /^bc$/,它将不会匹配,因为 bc 不在开头。

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

    {6,20}量词部分,意思是6到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_]* ,那只是作为“解决方法”

最后,这个正则表达式只是确保输入:

  1. 长度为 6 到 20 个字符
  2. 最少:1 个小写字母、1 个大写字母和 1 个数字
  3. 允许的字符是字母(大写和小写 (az,AZ))、数字和下划线。

三个有趣的网站www.regexper.comwww.regular-expressions.infowww.regex101.com

注意:不要限制密码,无论如何你都必须对它们进行哈希处理。看看这里或检查关于 SO 的其他问题。

于 2013-04-16T22:59:44.187 回答
0

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

正如量词和前瞻所暗示的那样,作者的意图可能是匹配 6 到 20 个单词字符之间的所有密码,其中至少有一个数字、一个大写和一个小写。

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

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

或者这个没有多余的\w

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

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

正如评论中所说,这种模式来自Larry Ullman 的《Effortless E-commerce》第一版一书。

即使作者写道:

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

即使我不同意句子的第二部分,我认为这种模式只是一个简单的错字。但是我不知道这个是否在第二版中得到了更正。

于 2013-04-16T22:31:47.917 回答