正则表达式和preg_match()

时间:2012-01-10 02:07:39

标签: php regex

我疯狂地使用正则表达式。这是我想要完成的:我想要一个8个字符的密码,允许大写和小写字母,数字和!@#$%^& * -_字符。以下是我看似不起作用的内容:

preg_match('([A-za-z0-9-_!@#$%^&*]{8,})', $password)

我错过了一些非常明显的东西吗?

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

2 个答案:

答案 0 :(得分:3)

基本上你错过了一个开场[字符组括号:

              ↓
 preg_match('([A-za-z0-9-_!@#$%^&*()]{8,})', $password)

你还应该使用delimiters。 parens将表现如此,但最好使用另一对来避免捕获组的歧义:

 preg_match('/^([A-za-z0-9-_!@#$%^&*()]{8,})$/', $password)

这也会添加start ^和end $断言以匹配整个字符串。

答案 1 :(得分:0)

这可能更容易打破个别规则。即一个规则来检查密码是否至少8个字符长,另一个检查是否为大写,另一个是小写,等等。

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