包含至少 8 个字符和至少 1 个非字母数字字符的密码的正则表达式

Posted

技术标签:

【中文标题】包含至少 8 个字符和至少 1 个非字母数字字符的密码的正则表达式【英文标题】:Regular Expression for a password with at least 8 characters and at least 1 non-alphanumeric character(s) 【发布时间】:2012-05-30 02:40:44 【问题描述】:

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

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

谢谢

【问题讨论】:

为什么必须是正则表达式? @robert 同意 robert 的观点,您应该分步执行,否则在您想添加更多条件的那一天,您将再次尝试弄清楚如何为您的正则表达式添加更多条件这完全不需要时间来编写代码并添加到您的代码中;) Here's a link 到一个解释你是否需要使用多字节函数的答案。这完全取决于您的字符编码。 【参考方案1】:

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

if( !preg_match( '/[^A-Za-z0-9]+/', $password) || strlen( $password) < 8)

    echo "Invalid password!";

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

【讨论】:

我在 猜测 这是因为它不检查所需的特殊字符。但不是我,所以我不确定。 @JohnConde - 我不认为是这样,因为确实会检查特殊字符,请参阅this example。 @nickb 我做到了,John Conde 做对了,你没有尊重问题的要求并在今天的上下文中使用危险的函数......总是使用 mb_strlen 代替,因为如果我传入“ gâteaux" 作为密码,您的检测有效,但我只有 7 个字符,strlen 将返回 8 个字符... 现在可以使用了。我能问一下它在哪里检查特殊字符吗? 它检查正则表达式中的特殊字符。正则表达式显示“匹配至少一个不存在于列表A-Za-z0-9 中的字符”。因此,如果它找到一个非字母数字字符,它将返回 true。如果没有这样的字符,则返回 false。通过在函数调用之前用! 反转该逻辑,它会导致在不存在非字母数字字符时评估if 语句。【参考方案2】:

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

您需要做的是分三步完成:

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

这没有经过测试,但你已经非常接近你想要实现的目标了......

祝你好运

【讨论】:

您可以在一个正则表达式中执行此操作。我的答案实际上可以处理它,甚至可以扩展为需要更复杂的密码。 这不是只将少数字符计为非字母数字吗?反引号、大括号、管道等呢?【参考方案3】:

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

$password = 'asdf123!';

if(mb_strlen($password) >= 8 and preg_match('/[^0-9A-Za-z]/', $password))

    // password is valid

【讨论】:

对此投反对票的任何理由?除非我们将重音字符等视为字母数字,否则我不确定此解决方案有什么问题。【参考方案4】:

试试这个。

~^(.*[\W]+.*)8,$~
.* 查找任何字符 0 次或更多次 [\W]+ 匹配至少一个非单词字符 8, 仅当长度为 8 个或更多字符时才匹配括号中的值 ^$匹配字符串的开头和结尾

【讨论】:

【参考方案5】:

这应该可以工作(未经测试)

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

    //error

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

【讨论】:

你能快速解释一下 "?=[\W]" 因为我不确定它是做什么的,这对我来说是新的,可能这里也有几个人 :) \W是\w的反义词,我知道很多 还是什么都没有:S。这就是我正在做的 $pass1 = "123abc!$"; if(preg_match('/^(?=[\W]+)[\w]8,$/', $pass1)) var_dump("inside"); 我要去玩。解决后我会通知你的。 好的,全部修复。我对特殊字符的语法有点不对。【参考方案6】:

这样就解决了。试一试!

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";

【讨论】:

以上是关于包含至少 8 个字符和至少 1 个非字母数字字符的密码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等

密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等

R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]

8到20位字母,数字或字符至少两种啥意思

C++ 检查字符串是不是包含至少 1 个数字和 1 个字母

需要一个包含至少一个数字、零个或多个字母、没有空格、最小/最大的正则表达式