这个正则表达式有用吗?

时间:2009-06-24 06:32:24

标签: php regex validation passwords

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

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

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

它的目的是成为密码验证器。语言是PHP。

6 个答案:

答案 0 :(得分:5)

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

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

  1. 这个正则表达式检查是什么?
  2. 为什么你有这么大的允许字符集?
  3. 为什么不使用/\w/代替/0-9a-zA-Z_/
  4. 为什么你在()中拥有整件事?你不需要捕捉整个事物,因为你已经拥有了整个事物,并且不需要将它们分组。
  5. 我要做的是分别检查长度,然后检查正则表达式,看它是否有任何字符。你的好字符列表似乎足够大,以这种方式可能更容易。但这可能取决于你正在做什么。

    编辑:现在我知道这是以PHP为中心的,/\w/是安全的,因为PHP使用的PCRE库不完全是Perl,而在PCRE中,\w不< / em>匹配Unicode字符。因此,为什么不检查长度并确保没有无效字符:

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

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

    preg('^[[:graph:]]+$', $string) == 1
    

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

    preg('[[:^graph:]]', $string) == 0
    

答案 1 :(得分:1)

Regex buddy是你的朋友。

答案 2 :(得分:1)

您忘记了逗号(,)和句号(.)并添加了不属于您的规范的代字号(~)和重音符号(`)。此外,必须转义字符集声明中的几个字符:

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

这是preg_match的PHP字符串声明:

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

答案 3 :(得分:0)

我注意到你基本上拥有所有的ASCII,除了反斜杠,空格和控制字符在开头,那么这个呢?相反呢?

^([!-\[\]-~]{4,})$

答案 4 :(得分:0)

您正在进行额外的转义,并且没有使用某些预定义的字符类(例如\ w或至少\ d)。

除此之外,你在开头和结尾处锚定,这意味着正则表达式只会在字符串开始和结束匹配时匹配,它看起来是正确的:

^([a-zA-Z\d\-!$@#$%^&*()|_+=\[\]{};,."'<>?/~`]{4,})$

如果您真的打算将其用作密码验证器,那就会让人感到不安全感:

  • 为什么要允许4个字符密码?
  • 你为什么要禁止一些角色? PHP无法处理一些?你为什么要关心?让用户输入他喜欢的字符,毕竟你最终会存储哈希+盐。

答案 5 :(得分:0)

没有。该正则表达式不适用于您声明的规则,原因很简单,$默认情况下匹配 最终字符(如果它是换行符)。您允许使用密码字符串,例如“1234 \ n”。

解决方案很简单。使用\z代替$,或将D修饰符应用于正则表达式。