使用正则表达式验证密码

时间:2011-05-01 14:06:09

标签: php regex validation

我有一个密码字段,应该符合以下条件

  1. 应至少有一个字母和一个数字
  2. 的最小长度为5,最大长度为20
  3. 另外,我想知道所有语言的正则表达式是否相同?

    开始使用正则表达式(假设我只有一个基本的理解)的好教程的链接也很不错。

    谢谢

2 个答案:

答案 0 :(得分:5)

最小值和最大值只使用strlen

我将使用preg_match的一个字符和一个数字:

$len = strlen($string);

if ($len < 5) {
     // too short
}elseif ( $len > 20) {
     // too long.
}elseif (!preg_match('#[0-9]#', $string)) {
     // does not contain a digit
}elseif (!preg_match('#[a-z]#i', $string)) {
     // does not have a character
} 

我喜欢打破我的多次检查,这样我就能告诉用户究竟缺少什么。有些人喜欢把它捆绑成一个。

答案 1 :(得分:4)

正则表达式是密码验证的一个非常好的工具。可以使用从字符串开头应用的前瞻断言(使用AND逻辑工作)来应用多个规则,如下所示:

$re = '/
    # Match password with 5-20 chars with letters and digits
    ^                # Anchor to start of string.
    (?=.*?[A-Za-z])  # Assert there is at least one letter, AND
    (?=.*?[0-9])     # Assert there is at least one digit, AND
    (?=.{5,20}\z)    # Assert the length is from 5 to 20 chars.
    /x';
if (preg_match($re, $text)) {
    // Good password
}

这是Javascript等价物:

var re = /^(?=.*?[A-Za-z])(?=.*?[0-9])(?=.{5,20}$)/;
if (re.test(text)) {
  // Good password
}

使用正则表达式进行密码验证的好文章是:Password Strength Validation with Regular Expressions。 (虽然他最后的表达方式包括一个错误的点星 - 请参阅我在他博客上的评论)。

另请注意,正则表达式语法因语言而异(但大多数都是在Perl语法上收敛)。如果你真的想知道正则表达式(在Neo:“我知道Kung-Fu”意义上),那么没有比坐下阅读更好的方法了:{ {3}}杰弗里弗里德尔。

附加:可以做出一个很好的论据,即密码验证应该分成多个测试,这些测试允许代码为每种类型的验证错误提供特定的错误消息。这里提供的答案旨在演示一种使用一个正则表达式验证多个规则的正确方法。

快乐的复兴!