2012-01-10 75 views
1

我疯狂地用正则表达式绿色。这是我想要实现的:我想要求一个8位字符的密码,它允许大写和小写字母,数字和!@#$%^ & * -_个字符。以下是我已经不似乎工作:正则表达式和preg_match()

preg_match('([[email protected]#$%^&*]{8,})', $password)

我缺少的东西真的很明显?

更新:是的,我错过了一些非常明显的东西 - 左括号[。但是,当我使用像单引号或括号这样的字符时,它仍然会返回true。 (这是我试图避免的。)

+1

这是您的实际正则表达式吗?你错过了第一个括号,你的第一个范围应该是A-Z – 2012-01-10 02:10:23

+1

你限制字符集而不是允许所有字符的任何特定原因? – FtDRbwLXw6 2012-01-10 02:11:13

+0

当看到密码字符集的任何限制时,我总是感到惊讶。为什么我不在密码中使用','(逗号)?! – zerkms 2012-01-10 02:13:34

回答

3

基本上你错过这里的开口[字符组支架:

   ↓ 
preg_match('([[email protected]#$%^&*()]{8,})', $password) 

而且你也应该使用delimiters。在括号将表现为这样的,但最好使用不同的配对,以避免与捕获组歧义:

preg_match('/^([[email protected]#$%^&*()]{8,})$/', $password) 

这也增加了启动^,结束$断言整个字符串相匹配。

+2

另外,'A-z'应该是'A-Z',而连字符('-')应该被转义:'\ -'。 – FtDRbwLXw6 2012-01-10 02:16:37

+1

错过了案例不匹配。非偶然的连字符会偶然发生*,因为它遵循有效的范围,它不能是范围本身的一部分。 (虽然可能是PCRE的一个特点。) – mario 2012-01-10 02:18:52

+0

非常感谢。它的工作,但我仍然有点不确定为什么。开始和结束的断言是做什么的? (请原谅我的无知) – drewwyatt 2012-01-10 02:21:46

0

这可能更容易分解成单独的规则。即一个规则来检查密码是否至少8个字符长,另一个检查大写,另一个检查大写,另一个小写等。

此外,它看起来像正则表达式中有一些特殊字符没有任何转义。例如,除了一些特殊情况,*字符在正则表达式中具有特殊含义。它可能需要转义\*或括号内[*]