为什么这个正则表达式会失败?

时间:2010-06-10 15:45:04

标签: php regex special-characters

我在PHP中有一个密码验证脚本,它检查一些不同的正则表达式,并根据哪一个失败抛出一个唯一的错误消息。以下是正则表达式的数组以及匹配失败时引发的错误消息:

array(
    'rule1' => array(
        '/^.*[\d].*$/i',
        'Password must contain at least one number.'
    ),
    'rule2' => array(
        '/^.*[a-z].*$/i',
        'Password must contain at least one lowercase letter'
    ),
    'rule3' => array(
        '/^.*[A-Z].*$/i',
        'Password must contain at least one uppercase letter'
    ),
    'rule4' => array(
        '/^.*[~!@#$%^&*()_+=].*$/i',
        'Password must contain at least one special character [~!@#$%^&*()_+=]'
    )
);

出于某种原因,无论我通过验证,“特殊字符”规则都会失败。我猜这是表达式的一个问题。如果有更好(或更正确)的方式来编写这些表达式,我全都听见了!

3 个答案:

答案 0 :(得分:6)

我看不到你的特殊字符正则表达式的问题,但我可以看到大小写检查有问题:

/^.*[A-Z].*$/i

最后的i表示PCRE_CASELESS,即它会忽略大小写。您应该省略i

答案 1 :(得分:1)

正则表达式应该只是:

/[~!@#$%^&*()_+=]/

不需要星星。无论哪种方式你的正则表达式应该工作。

我会检查使用数组的函数,看看是否有任何逻辑错误。

另外,正如Mark Byers所述,您应该删除不敏感修饰符/i

答案 2 :(得分:0)

这有效(as seen on rubular.com):

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*()_+=]).*

这使用了lookahead(PHP的preg函数支持,因为它们是PCRE),而不是匹配所有不同的规则。我不确定你为什么不工作。

参考