我是正则表达式的新手。
我需要使用 php 验证密码,并使用 Regex 使用以下密码策略:
密码:
- 必须至少有 8 个字符
- 必须有2个数字
- 允许的符号是:
! @ # $ % *
我尝试了以下方法: /^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]$/
以下内容完全符合您的要求:^(?=.*\d.*\d)[0-9A-Za-z!@#$%*]{8,}$
在线演示 <<< You don't need the modifiers, they are just there for testing purposes.
解释
^
: 匹配字符串的开头(?=.*\d.*\d)
: 正向前瞻,检查是否有 2 位数字[0-9A-Za-z!@#$%*]{8,}
: 匹配数字、字母和!@#$%*
8 次或更多次$
: 匹配字符串结尾我会首先尝试使用非正则表达式(或preg_match_all('[0-9]', ...) >= 2
,然后验证:
^[!@#$%*a-zA-Z0-9]{8,}$
这应该更快更容易理解。要仅使用正则表达式声音来做到这一点,您需要先行,它基本上会扫描表达式两次 afaik,尽管我不确定那个的 PHP 内部结构。
准备好接受很多关于密码不被接受的投诉。我个人有很大一部分密码无法针对这些限制进行验证。像这样无意义的密码12345678
也会验证,甚至是11111111
,但不是f4#f@faASvCXZr$%%zcorrecthorsebatterystaple
。
if(preg_match('/[!@#$%*a-zA-Z0-9]{8,}/',$password) && preg_match_all('/[0-9]/',$password) >= 2)
{
// do
}
使用 PHP 进行完整的强密码验证
/^\S*(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=\S*[\W])[a-zA-Z\d]{8,}\S*$/