正则表达式以匹配最低密码要求和其他字符

时间:2014-06-11 14:03:20

标签: php regex

我希望用户在我的网站上注册以选择包含以下内容的密码:

  • 最少8个字符
  • 至少一个大写
  • 至少一个小写
  • 至少一位数。 但这些是最低要求。只要符合这些要求,它们就可以包括任何字符,如@,#和&等。我有以下正则表达式:

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

但它与上面列出的要求中的其他字符不匹配。我希望能够匹配可以包含任何字符但仍满足上述条件的密码。我该怎么做?

3 个答案:

答案 0 :(得分:2)

这将做你想要的:

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

Demo on regex101

Debuggex Demo

说明:

Regular expression visualization

  • ^匹配字符串的开头
  • (?=.*[A-Z])需要大写字符
  • (?=.*[a-z])需要小写字符
  • (?=.*\d)需要一个数字
  • .{8,}要求最小长度为8。

注意:与anubhava的答案不同,这允许使用空格字符。如果您不想要空格,请按照anubhava的建议使用\S

编辑:根据@ridgerunner在评论中的优点,这里有一个稍微高效的正则表达式:

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

此版本避免了惰性.*表达式,这会浪费时间来测试此上下文中的整体正则表达式。

答案 1 :(得分:2)

不要在一个正则表达式中完成所有操作。使每个验证成为自己的检查更具可读性和可维护性。

$passes =
    preg_match( '/[A-Z]/', $pw ) && # uppercase char
    preg_match( '/[a-z]/', $pw ) && # lowercase char
    preg_match( '/\d/', $pw ) &&    # digit
    (strlen($pw) > 8);              # at least 8 characters

答案 2 :(得分:0)

使用此正则表达式:

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

我使用了\S(任何非空格字符)而不是\w(单词字符表示[a-zA-Z0-9_]