我想创建一个preg_match
函数来验证我的密码,但我不确定如何编写它以允许使用以下特殊字符:!@#$%
.
if(!preg_match(?????)$/', $password))
以下是我想在正则表达式中使用的密码规则:
- 可能包含字母和数字
- 必须至少包含 1 个数字和 1 个字母
- 可以包含以下任何字符:
!@#$%
- 必须为 8-12 个字符
感谢您提供的任何帮助。
我认为这应该是这样的:
if(!preg_match('/^(?=.*'d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,12}$/', $password)) {
echo 'the password does not meet the requirements!';
}
在开始 -> ^
之间和结束 -> $
字符串中必须至少有一个数字 -> (?=.*'d)
和至少一个字母 -> (?=.*[A-Za-z])
它必须是数字、字母或以下之一:!@#$% -> [0-9A-Za-z!@#$%]
并且必须有 8-12 个字符 -> {8,12}
正如user557846对您的问题发表评论的那样,我还建议您允许更多字符,我通常(如果我使用最大值)至少需要50:)
顺便说一句,你可能想看看这个正则表达式教程
preg_match('/^(?=.*'d)(?=.*[@#'-_$%^&+=§!'?])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z@#'-_$%^&+=§!'?]{8,20}$/',$password)
- 至少一个小写字符
- 至少一个大写字符
- 至少一位数字
- 至少有一个特殊符号 @#-_$%^&+=§!?
我喜欢
r3bel的答案,所以我玩了一下,最终得到了以下密码检查功能:
function password_strength_check($password, $min_len = 8, $max_len = 70, $req_digit = 1, $req_lower = 1, $req_upper = 1, $req_symbol = 1) {
// Build regex string depending on requirements for the password
$regex = '/^';
if ($req_digit == 1) { $regex .= '(?=.*'d)'; } // Match at least 1 digit
if ($req_lower == 1) { $regex .= '(?=.*[a-z])'; } // Match at least 1 lowercase letter
if ($req_upper == 1) { $regex .= '(?=.*[A-Z])'; } // Match at least 1 uppercase letter
if ($req_symbol == 1) { $regex .= '(?=.*[^a-zA-Z'd])'; } // Match at least 1 character that is none of the above
$regex .= '.{' . $min_len . ',' . $max_len . '}$/';
if(preg_match($regex, $password)) {
return TRUE;
} else {
return FALSE;
}
}
最大/最小长度是默认或可调的,每个要求都是默认打开的,但可以关闭,我想支持任何符号,所以最后一个要求是"任何不属于上述类型之一的东西",而不是一组固定的符号。
我已经开发了一个完整的正则表达式,用于更复杂的检查
/^(?=.*'d)(?=.*[A-Za-z])(?=.*[A-Z])(?=.*[a-z])(?=.*[ !#$%&''(') * +,-.'/[''] ^ _`{|}~'"])[0-9A-Za-z !#$%&''(') * +,-.'/[''] ^ _`{|}~'"]{8,50}$/
基本上,我检查密码是否有1位数字,1个大写字母,1个小字符和1个特殊字符。我希望这有助于寻找正则表达式的人。
if (!preg_match('/^(?=.*'d)(?=.*[A-Za-z])(?=.*[!@#$%])[0-9A-Za-z!@#$%]
{6,15}$/',($_POST['password']))) {
$message='Password must contain 6 characters of letters, numbers and
at least one special character.';
}
我已经用我的drupal自定义表单完成了hook_form_validate
这里的密码应该是6个字符的字母,数字和至少一个特殊字符。
<?
if (!preg_match('/^(?=.*'d)(?=.*[A-Za-z])(?=.*[!@#$%])[0-9A-Za-z!@#$%]{6,15}$/', $form_state['values']['pass'])) {
form_set_error('pass', t('Password must contain 6 characters of letters, numbers and at least one special character.'));
}
?>
另一种方式
让我们看起来不同,我相信用户可以使用密码中(32 < ascii_code < 127)
的所有 ASCII 有效字符,并创建一个函数来检查 ASCII 表中的所有字符!
function check($pass, $i = 0){
if(strlen($pass) > $i)
return (0rd(pass[$i]) > 32 and 0rd(pass[$i]) < 127) and check($pass, $i + 1);
}
用法
if(!check($_POST["password"])){
echo "password is wrong";
}
查找
字符类,这是正则表达式的基本功能。
if(!preg_match('/^(?=.*'d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,12}$/', $password)) {
echo 'the password does not meet the requirements!';
}
在上面的声明中..因此存在什么可能的密码?