PHP Regex - 最少8个字符,1个字母,1个数字

时间:2015-06-01 20:45:45

标签: php regex

所以我以为我做对了吗?

        if(!preg_match('^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+.{7,}$', $passOne)) {
            $msg = "Password does not contain at least 1 number/letter, 8 character minimum requirement.";
        }

我在https://regex101.com/对其进行了测试,并将^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+.{7,}$用于工作,RubyGlue12之类的内容通过并且匹配其他内容并且不是。

但无论如何,我都无法在实际的PHP代码中进行任何匹配。即使POST是手动变量。

修改:$_POST['password']$passOne

帮助?

2 个答案:

答案 0 :(得分:3)

你有.+.{7,}没有多大意义,因为它意味着匹配任何字符1次或更多次,然后任何字符匹配7次或更多次

1个字母,1个数字和最少8个字符的正则表达式看起来像

(?i)^(?=.*[a-z])(?=.*\d).{8,}$

正则表达式解释:

  • (?i) - 关闭案例敏感度(除非您需要检查1个大写和1个小写字母 - 然后,删除i标记并替换{{1}与(?=.*[a-z])
  • (?=.*[a-z])(?=.*[A-Z]) - 字符串开头
  • ^ - 要求至少有一个字母的正面预见
  • (?=.*[a-z]) - 至少有一位数的正向前瞻要求
  • (?=.*\d) - 至少8个字符
  • .{8,} - 字符串结束。

PHP代码是:

$

是的,使用$re = "/^(?=.*[a-z])(?=.*\\d).{8,}$/i"; $passOne = "RubyGlue12"; //$passOne = "eee"; // uncomment to echo the error message if(!preg_match($re, $passOne)) { echo "Password does not contain at least 1 number/letter, 8 character minimum requirement."; } 函数,您必须使用一些正则表达式分隔符。我在这里使用preg_match

答案 1 :(得分:1)

这是一个正则表达式,可以测试密码不应该的内容,而不是应该的密码。

/^(.{0,7}|[^a-z]*|[^\d]*)$/i

示例:

if (preg_match('/^(.{0,7}|[^a-z]*|[^\d]*)$/i', $passOne)) {
  echo "Validation failed.\n";
}

<强>解释

正则表达式中基本上有3个单独的测试(每个测试由|分隔,并且由于最后的i选项,每个测试都不区分大小写。如果传递任何测试,那么整个验证将失败

  • 测试1:整个字符串是否只包含0-7个字符?的失败。
  • 测试2:整个字符串是否不包含字母字符?的失败。
  • 测试3:整个字符串是否包含数字?的失败。