Php 使用preg_匹配的密码参数

Php 使用preg_匹配的密码参数,php,regex,Php,Regex,我试图将密码参数设置为8-20个字符长,至少有一个大写字符、数字和符号。我已经写了这样的代码 (preg_match ('/^(\W+)(\d+)([A-Z]+)([a-z]+){8,20}$/', $_POST['pass1']) ) 我对我的守则的解释如下: W+ one or more symbols (non alpha numeric) d+ one or more numbers [A-Z]+ one or more uppercase characters [a-z

我试图将密码参数设置为8-20个字符长,至少有一个大写字符、数字和符号。我已经写了这样的代码

  (preg_match ('/^(\W+)(\d+)([A-Z]+)([a-z]+){8,20}$/', $_POST['pass1']) )
我对我的守则的解释如下:

W+   one or more symbols (non alpha numeric)
d+   one or more numbers
[A-Z]+  one or more uppercase characters
[a-z]+  one or more lower case characters
{8,20}  string length min 8 max 20
/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*\W)[0-9A-Za-z!@#$%]{8,20}$/

当我以Anyhelp4me的身份输入密码时!我收到一条无效的密码消息。你的建议是什么。

好的……我试过前面的建议,它只施加了“8,10”限制。我在stackoverflow“Create preg_match for password validation allowing(!@#$%)中发现了这一点,并修改了该响应中显示的代码,如下所示:

W+   one or more symbols (non alpha numeric)
d+   one or more numbers
[A-Z]+  one or more uppercase characters
[a-z]+  one or more lower case characters
{8,20}  string length min 8 max 20
/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*\W)[0-9A-Za-z!@#$%]{8,20}$/

我已经测试了好几次,它确实有效。您必须至少有一个数字、一个大写字母、一个小写字母和一个指定的符号(!@#$%),并且必须有8到20个字符。

不要用一个正则表达式来完成所有操作。如果您用多个正则表达式多次调用preg\u match,那么将来将更易于维护、理解和更改

$password_is_ok =
    preg_match( '/\W/', $pass ) &&
    preg_match( '/\d/', $pass ) &&
    preg_match( '/[a-z]/', $pass ) &&
    preg_match( '/[A-Z]/', $pass ) &&
    strlen( $pass ) >= 8 &&
    strlen( $pass ) <= 20;
$password\u正常=
预匹配('/\W/',$pass)&&
预匹配('/\d/',$pass)&&
预匹配('/[a-z]/',$pass)&&
预匹配('/[A-Z]/',$pass)&&
斯特伦($pass)>=8&&

strlen($pass)和regex101的解释:限制密码长度的目的是什么?拥有21个字符的密码是一种安全隐患还是什么?很好的建议…它更“易读”和易懂