这个正则表达式有用吗?

Nik*_*kko 1 php regex passwords validation

^([a-zA-Z0-9!@#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$
Run Code Online (Sandbox Code Playgroud)

这个正则表达式是否适用于这些规则?

  • 必须至少4个字符
  • 字符可以是字母(大写/非大写),数字和以下字符的混合:!@#$%^&*()_ - + = | [{}]; :'",<.>?/

它旨在成为密码验证器.语言是PHP.

Chr*_*utz 5

是?

老实说,你要的是什么?你为什么不测试它?

但是,如果您想要改进它的建议,可以提出一些问题:

  1. 这个正则表达式检查是什么?
  2. 为什么你有这么大的允许角色?
  3. 你为什么不用/\w/而不是/0-9a-zA-Z_/
  4. 你为什么要把整件事放在()一边?你不需要捕捉整个事物,因为你已经拥有了整个东西,并且它们不需要分组任何东西.

我要做的是分别检查长度,然后检查正则表达式,看它是否有任何不良字符.你的好字符列表似乎足够大,以这种方式可能更容易.但这可能取决于你正在做什么.

编辑:现在,我知道这是PHP为中心的,/\w/是安全的,因为PHP使用PCRE库,这是不完全的Perl,并在PCRE,\w符合Unicode的单词字符.因此,为什么不检查长度并确保没有无效字符:

if(strlen($string) >= 4 && preg_match('[\s~\\]', $string) == 0) {
  # valid password
}
Run Code Online (Sandbox Code Playgroud)

或者,使用很少使用的POSIX字符类[[:graph:]].它应该在PHP中与在Perl中完全相同.[[:graph:]]匹配任何字母数字或标点字符,听起来像你想要的,并[[:^graph:]]应匹配相反的.要测试所有字符是否与图形匹配:

preg('^[[:graph:]]+$', $string) == 1
Run Code Online (Sandbox Code Playgroud)

要测试是否有任何字符与图形不匹配:

preg('[[:^graph:]]', $string) == 0
Run Code Online (Sandbox Code Playgroud)