我希望用户在我的网站上注册以选择包含以下内容的密码:
至少一位数。 但这些是最低要求。只要符合这些要求,它们就可以包括任何字符,如@,#和&等。我有以下正则表达式:
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)\w{8,20}$/
但它与上面列出的要求中的其他字符不匹配。我希望能够匹配可以包含任何字符但仍满足上述条件的密码。我该怎么做?
答案 0 :(得分:2)
这将做你想要的:
/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$/
说明:
^
匹配字符串的开头(?=.*[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_]
)