4

如果用户更改密码,我正在尝试检查 PHP,他们的新密码必须是 8 个或更多字符并且至少有 1 个非字母数字密码。我应该如何检查这个以及正则表达式是什么?

检查长度是容易的部分strlen >= 8。我的问题是正则表达式。即使经过多年的计算机科学学习,我仍然对正则表达式一无所知。

谢谢

4

6 回答 6

5

尝试这样的事情来检查他们是否使用了非字母数字字符:

if( !preg_match( '/[^A-Za-z0-9]+/', $password) || strlen( $password) < 8)
{
    echo "Invalid password!";
}

如果不包含至少一个不在列表中的字符(字母数字字符),则该if语句将评估为。true$password

于 2012-05-23T14:21:00.263 回答
0

这应该有效(未经测试)

if (preg_match('/^(?=.*[\W])(?=[a-z0-9])[\w\W]{8,}$/i', '123abc!$'))
{
    //error
}

它确保密码长度为 8 个字符,并且至少包含一个特殊字符

于 2012-05-23T14:19:28.297 回答
0

如果您使用 strlen/mb_strlen 检查字符串长度,您可以简单地编写一个正则表达式来匹配任何非字母数字字符。如果它匹配一个(或多个),你很好。例如:

$password = 'asdf123!';

if(mb_strlen($password) >= 8 and preg_match('/[^0-9A-Za-z]/', $password))
{
    // password is valid
}
于 2012-05-23T14:20:50.017 回答
0

据我所知,您无法做到这一点,因为它是一个复合条件场景。

您需要做的是分三步进行:

$has8characters = (mb_strlen($_REQUEST['password']) >= 8);
$hasAlphaNum = preg_match('b[a-z0-9]+bi', $_REQUEST['password']);
$hasNonAlphaNum = preg_match('b[\!\@#$%\?&\*\(\)_\-\+=]+bi', $_REQUEST['password']);

这没有经过测试,但你非常接近你想要达到的目标......

祝你好运

于 2012-05-23T14:22:26.677 回答
0

试试这个。

~^(.*[\W]+.*){8,}$~
  • .* 查找任何字符 0 次或更多次
  • [\W]+ 匹配至少一个非单词字符
  • {8,} 仅当长度为 8 个或更多字符时才匹配括号中的值
  • ^ $ 匹配字符串的开头和结尾
于 2012-05-23T14:44:29.390 回答
0

这解决了它。试试!

if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$/', $pass)) {
  echo "Password does not meet the requirements! It must be alphanumeric and atleast 8 characters long";
}
于 2018-01-02T15:07:10.083 回答