我在PHP中为preg_match($pattern, $password)
函数创建$模式,它应该是一个以这种方式定义字符串的正则表达式:
$str_lenght
长AND $num_capitals
个大写字母AND $num_numerals
个数字和$num_symbols
:!@#$%^& *() - +?我该怎么做?
答案 0 :(得分:3)
您可以使用lookaheads以这种方式构建正则表达式:
$re = '/(?=(.*?[A-Z]){' . $num_capitals . '})(?=(.*?[0-9]){' . $num_numerals .
'})(?=(.*?[!@#$%^&*()+?-]){' . $num_symbols . '}).{' . $str_lenght . ',}/';
答案 1 :(得分:1)
@anubhava极大地摧毁了我的答案,但我会留下它以换取其他方法
.
匹配所有字符,{5,}
重复5次以上。但是,由于我们没有制作一个长表达式,我仍然会使用更快的strlen()
。 Demo:
.{5,}
对于其余的,我会匹配一个字符类并使用preg_match_all()
来返回匹配的总数(可能是0)。
以下是您想要的3个字符类:
[A-Z]
[0-9] OR \d (\d will match other numeric characters, like Arabic, etc.)
[!@#$%^&*()+?-]
示例实现:
$count = preg_match_all('/[A-Z]/', 'FOObar', $matches);
// $count = 3;
请注意,在最后一个字符类([!@#$%^&*()+?-]
)中,^
不得先出现,而-
不得位于中间位置。否则您需要逃脱他们与\
因为具有特殊意义。
答案 2 :(得分:0)
试试这个
$strRegex = '/((?=.*\d).{'.$num_numerals.'})((?=.*[a-z]).{'.$num_lower.'})((?=.*[A-Z]).{'$num_upper'})((?=.*[@#$%]).{'.$num_symbols.'})/';
或
$strRegex = '/((?=.*\d).{'.$num_numerals.'})((?=.*[a-z]).{1,'.$num_lower.'})((?=.*[A-Z]).{'$num_upper'})((?=.*[@#$%]).{'.$num_symbols.'})/';
基于$ num_lower,您可以限制密码中允许的字符数。 传递将接受从1到$ num_lower
的小写