我有这个功能:
public static function encPasswordCheckFailed($password)
{
if (!preg_match('/[A-Z]+/', $password)){
return true;
}
if (!preg_match('/[a-z]+/', $password)){
return true;
}
if (!preg_match('/[0-9]+/', $password)){
return true;
}
if (!preg_match('/[!@#$%^&*()-+<>]+/', $password)) {
return true;
}
return false;
}
现在我想强制用户至少有1个大写字母,1个小写字母,1个数字和1个特殊字符。
我遇到了这个问题:
if (!preg_match('/[!@#$%^&*()-+<>]+/', $password)) {
return true;
}
所有其他要求都有效。我对特殊字符只有一个问题。
有人可以告诉我这些特殊字符的正确模式:!@#$%^&*()-+<>
答案 0 :(得分:2)
您可能需要转义正则表达式引擎使用的一些特殊字符。顺便说一句,你可以在一个Go中做到这一点,如下所示。 Quick-Test Here
<?php
/*public static*/ function encPasswordCheckFailed($password) {
// THIS READS:
// IF THE PASSWORD DOES CONTAIN AN UPPER-CASE CHARACTER
// AND ALSO DOES CONTAIN A LOWER-CASE CHARACTER
// AND STILL DOES CONTAIN A NUMERIC CHARACTER
// AND EVEN MORE, DOES CONTAIN ANY OF THE SPECIFIED SPECIAL CHARACTERS
// RETURN FALSE OTHERWISE RETURN TRUE
if (preg_match('/[A-Z]+/', $password) && // CHECK FOR UPPERCASE CHARACTER
preg_match('/[a-z]+/', $password) && // AND CHECK FOR LOWERCASE CHARACTER
preg_match('/[0-9]+/', $password)&& // AND CHECK FOR NUMERIC CHARACTER
preg_match('/[\!@#$%\^&\*\(\)\-\+<>]+/', $password) // AND CHECK FOR SPECIAL CHARACTER
) {
return false;
}
return true;
}
var_dump( encPasswordCheckFailed("abcd123") ); //<== boolean true
var_dump( encPasswordCheckFailed("abcD123") ); //<== boolean true
var_dump( encPasswordCheckFailed("abcD1@23-") ); //<== boolean false
答案 1 :(得分:1)
短划线/减号字符是您的问题,因为在字符组中,它表示字符范围。
您需要:
/[!@#$%^&*()\-+<>]+/
/[!@#$%^&*()+<>-]+/
同样,插入符号(^
)也是一个特殊字符,表示在字符组内部时出现否定,但是因为你没有把它放在字符组内的第一个位置,所以PCRE引擎知道它没有特殊意义。
答案 2 :(得分:0)
这将适用于特殊角色:
preg_match('/\[!@#$%^&*\(\)\-+<>\]+/', $password);
如果它不起作用,请往下看:
其他答案: