我在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 [~!@#$%^&*()_+=]'
)
);
出于某种原因,无论我通过验证,“特殊字符”规则都会失败。我猜这是表达式的一个问题。如果有更好(或更正确)的方式来编写这些表达式,我全都听见了!
答案 0 :(得分:6)
答案 1 :(得分:1)
正则表达式应该只是:
/[~!@#$%^&*()_+=]/
不需要星星。无论哪种方式你的正则表达式应该工作。
我会检查使用数组的函数,看看是否有任何逻辑错误。
另外,正如Mark Byers所述,您应该删除不敏感修饰符/i
答案 2 :(得分:0)
这有效(as seen on rubular.com):
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*()_+=]).*
这使用了lookahead(PHP的preg
函数支持,因为它们是PCRE),而不是匹配所有不同的规则。我不确定你为什么不工作。