对不起,如果这段代码很差,因为我只是通过一本书并为我的学校项目修改它,因为我刚开始使用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!';
}
任何帮助都会非常感激!谢谢!
非常感谢.. :))
答案 0 :(得分:3)
我们有以下正则表达式:
/^(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}$/
第一个和最后一个/
是分隔符。
^
- >一开始,$
- >结束
这意味着如果输入为abc
且您的正则表达式为/^bc$/
,则由于bc不在开头,因此无法匹配。
现在我们有(\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*){6,20}
{6,20}
是量词部分,表示最多20次。
让我们进一步打破正则表达式:\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*
让我们提供一些等价物:
\w
=> [A-ZA-Z0-9 _] \d
=> [0-9] *
=>零次或多次 (?=)
是一个先行断言。示例/a(?=b)/
这将匹配任何“a”后跟“b”
这些前瞻的目的:
(?=\w*\d)
=>检查是否有数字(?=\w*[a-z])
=>检查是否有小写字母(?=\w*[A-Z])
=>检查是否有大写字母(?=\w*\d)
:\w*
只是作为“解决方法”,以防万一[a-zA-Z0-9 _] *在数字之前最后,这个正则表达式确保输入:
三个有趣的网站www.regexper.com,www.regular-expressions.info和www.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”第一版。
即使作者写道:
“而且,诚然,即使我经常需要查找模式的正确语法,但这需要高水平的正则表达式专业知识。”
即使我不同意句子的第二部分,我认为这种模式是一个简单的错字。但是我不知道第二版是否已经纠正了这个问题。