我有这个功能:
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;
}
所有其他要求工作。我只是对特殊字符有问题。
谁能告诉我这些特殊字符的正确模式:!@#$%^&*()-+<>
我已经从这里,这里和这里阅读了一些答案,但他们没有帮助我进一步…
您可能需要转义正则表达式引擎使用的一些特殊字符。顺便说一下,你也可以一次完成,如下图所示。快速测试。
<?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
破折号/减号字符是您的问题,因为在字符组中,它表示字符范围。
你需要:
- 用反斜杠转义,这样它就不会被视为特殊字符:
/[!@#$%^&*()'-+<>]+/
- 或者把它放在模式的末尾,这样PCRE引擎就知道它不可能表示范围:
/[!@#$%^&*()+<>-]+/
类似地,插入符号(^
)也是一个特殊字符,在字符组内表示否定,但是因为您没有将它放在字符组内的第一个位置,所以PCRE引擎知道它在您的情况下没有特殊意义。
特殊字符
preg_match('/'[!@#$%^&*'(')'-+<>']+/', $password);
如果它不工作,向下看:
其他答案:
- preg_match php特殊字符(pmm的答案)