^([a-zA-Z0-9!@#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$
这个正则表达式是否适用于这些规则?
它的目的是成为密码验证器。语言是PHP。
答案 0 :(得分:5)
是
老实说,你要的是什么?你为什么不测试它?但是,如果您想要改进它的建议,可以提出一些问题:
/\w/
代替/0-9a-zA-Z_/
?()
中拥有整件事?你不需要捕捉整个事物,因为你已经拥有了整个事物,并且不需要将它们分组。我要做的是分别检查长度,然后检查正则表达式,看它是否有任何坏字符。你的好字符列表似乎足够大,以这种方式可能更容易。但这可能取决于你正在做什么。
编辑:现在我知道这是以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,})$
如果您真的打算将其用作密码验证器,那就会让人感到不安全感:
答案 5 :(得分:0)
没有。该正则表达式不适用于您声明的规则,原因很简单,$
默认情况下匹配 最终字符(如果它是换行符)。您允许使用密码字符串,例如“1234 \ n”。
解决方案很简单。使用\z
代替$
,或将D
修饰符应用于正则表达式。