Php 正则表达式不工作-定义组中至少有1个大写、3个小写、1个特殊字符(更多说明)

Php 正则表达式不工作-定义组中至少有1个大写、3个小写、1个特殊字符(更多说明),php,regex,passwords,Php,Regex,Passwords,我需要创建一个带有下一个要求的正则表达式:密码需要至少包含8个字符,最多包含12个字符,至少包含1个大写字母,至少包含3个小写字母,至少包含1个数字,以及组中至少包含1个特殊字符(#*。!?$),不包含括号。第一个字符必须是大写或小写字母。密码中不得出现两个连续的相同字符。 我做了这个,但不起作用: ^(?=.{8,12}$)(([a-z]|[A-Z])(?=.*\d){1,}(?=.*[a-z]){3,}(?=.*[A-Z]){1,}(?=.*[!.?*$#])\2?(?!\2))+$ 我试

我需要创建一个带有下一个要求的正则表达式:密码需要至少包含8个字符,最多包含12个字符,至少包含1个大写字母,至少包含3个小写字母,至少包含1个数字,以及组中至少包含1个特殊字符(#*。!?$),不包含括号。第一个字符必须是大写或小写字母。密码中不得出现两个连续的相同字符。 我做了这个,但不起作用:

^(?=.{8,12}$)(([a-z]|[A-Z])(?=.*\d){1,}(?=.*[a-z]){3,}(?=.*[A-Z]){1,}(?=.*[!.?*$#])\2?(?!\2))+$

我试着用Abcd123测试它!,但它不起作用。谁能解释一下我在哪里犯了错误,以及我在这里到底犯了什么吗?

你用一个像
{1,}
这样的量词来表示不正确的前瞻

我想你是想用这样的表情:

^(?=.{8,12}$)(?=[^A-Z]*[A-Z])(?=\D*\d)(?=(?:[^a-z]*[a-z]){3})(?=[^\s#*.!?$]*[#*.!?$])(?!.*(.)\1)(?:[a-z]|[A-Z])[a-zA-Z0-9#*.!?$,]+$
关于图案

  • ^
    字符串的开头
  • (?=.{8,12}$)
    断言长度8-12
  • (?=[^A-Z]*[A-Z])
    断言一个大写字符
  • (?=\D*\D)
    断言一个数字
  • (?=(?:[^a-z]*[a-z]){3}
    断言3个小写字符
  • (?=[^\s#*.!?$]*[#*.!?$])
    断言特殊字符
  • (?!.*()\1)
    不断言两个连续字符
  • (?:[a-z]|[a-z])
    以大写或小写字符开头
  • [a-zA-Z0-9#*.!?$,]+
    匹配字符类中列出的任何字符的1+倍
  • $
    断言字符串的结尾

|

您使用类似于
{1,}
的量词来表示不正确的前瞻

我想你是想用这样的表情:

^(?=.{8,12}$)(?=[^A-Z]*[A-Z])(?=\D*\d)(?=(?:[^a-z]*[a-z]){3})(?=[^\s#*.!?$]*[#*.!?$])(?!.*(.)\1)(?:[a-z]|[A-Z])[a-zA-Z0-9#*.!?$,]+$
关于图案

  • ^
    字符串的开头
  • (?=.{8,12}$)
    断言长度8-12
  • (?=[^A-Z]*[A-Z])
    断言一个大写字符
  • (?=\D*\D)
    断言一个数字
  • (?=(?:[^a-z]*[a-z]){3}
    断言3个小写字符
  • (?=[^\s#*.!?$]*[#*.!?$])
    断言特殊字符
  • (?!.*()\1)
    不断言两个连续字符
  • (?:[a-z]|[a-z])
    以大写或小写字符开头
  • [a-zA-Z0-9#*.!?$,]+
    匹配字符类中列出的任何字符的1+倍
  • $
    断言字符串的结尾

|

请让人们选择他们的密码。最后至少写20个字符。
至少写20个字符
-这应该是最小值,每种类型5个字符。。。J/PMy任务要求密码长度应在8到12个字符之间,这不是我的选择。你应该仔细阅读。请让人们选择他们的密码。最后至少写20个字符。
至少写20个字符
-这应该是最小值,每种类型5个字符。。。J/PMy任务要求密码长度应在8到12个字符之间,这不是我的选择。你应该仔细阅读。不幸的是,它仍然不起作用。起初,我尝试了最简单的带有长度限制的正则表达式,并使用了大写、小写和数字,结果成功了,但它只占我需要的正则表达式的20%。哪些匹配不起作用?另外80%应该匹配什么?图案中的外观标头符合您的要求。您可以在字符类
[a-zA-Z0-9#*!?$,]+
中添加您希望匹配的字符。您提供的正则表达式不起作用,我不明白为什么。你写的东西完全是我需要的,它可能需要一些修改才能工作。这20%是我以前做的,一些基本的正则表达式。这是工作的代码“$uppercase=preg_match”(“@[A-Z]@,$pass”)$小写=预匹配('@[a-z]@',$pass)$number=preg_match('@[0-9]@',$pass);`这就是不起作用的`$pattern='/^(?=.{8,12}$)(?=.[A-Z])(?=.[A-Z])(?=(?:..[A-Z])(?=.[.[.*!!!!$])(?!(?:[A-Z]|[A-Z])[A-zA-Z0-9###!!!!!!!!!!!!!!!!$regex=preg_match($pattern,$pass)`我发现了一个错误:我不应该将$\u POST放入md5函数中,因为它生成了许多与我的约束od 12个字符不匹配的字符。我刚在写数据库时使用了md5函数,它成功了。@第四只鸟,再次感谢您的帮助!不幸的是,它仍然不起作用。起初,我尝试了最简单的带有长度限制的正则表达式,并使用了大写、小写和数字,结果成功了,但它只占我需要的正则表达式的20%。哪些匹配不起作用?另外80%应该匹配什么?图案中的外观标头符合您的要求。您可以在字符类
[a-zA-Z0-9#*!?$,]+
中添加您希望匹配的字符。您提供的正则表达式不起作用,我不明白为什么。你写的东西完全是我需要的,它可能需要一些修改才能工作。这20%是我以前做的,一些基本的正则表达式。这是工作的代码“$uppercase=preg_match”(“@[A-Z]@,$pass”)$小写=预匹配('@[a-z]@',$pass)$number=preg_match('@[0-9]@',$pass);`这就是不起作用的`$pattern='/^(?=.{8,12}$)(?=.[A-Z])(?=.[A-Z])(?=(?:..[A-Z])(?=.[.[.*!!!!$])(?!(?:[A-Z]|[A-Z])[A-zA-Z0-9###!!!!!!!!!!!!!!!!$regex=preg_match($pattern,$pass)`我发现了一个错误:我不应该将$\u POST放入md5函数中,因为它生成了许多与我的约束od 12个字符不匹配的字符。我刚在写数据库时使用了md5函数,它成功了。@第四只鸟,再次感谢您的帮助!