Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式以匹配最低密码要求和其他字符_Php_Regex - Fatal编程技术网

Php 正则表达式以匹配最低密码要求和其他字符

Php 正则表达式以匹配最低密码要求和其他字符,php,regex,Php,Regex,我希望在我的网站上注册的用户选择包括以下内容的密码: 最少8个字符 至少有一个大写字母 至少有一个小写字母 至少一个数字。 但这些是最低要求。只要满足这些要求,它们可以包括@、#、&等任何字符。我有以下正则表达式: /^(?=.[a-z])(?=.[a-z])(?=...\d)\w{8,20}$/ 但它与上面列出的要求中的其他字符不匹配。我想能够匹配一个密码,可以包含任何字符,但仍然满足上述条件。如何执行此操作?使用此正则表达式: /^(?=.*?[a-z])(?=.*?[A-Z])(?=.

我希望在我的网站上注册的用户选择包括以下内容的密码:

  • 最少8个字符
  • 至少有一个大写字母
  • 至少有一个小写字母
  • 至少一个数字。 但这些是最低要求。只要满足这些要求,它们可以包括@、#、&等任何字符。我有以下正则表达式:

    /^(?=.[a-z])(?=.[a-z])(?=...\d)\w{8,20}$/

但它与上面列出的要求中的其他字符不匹配。我想能够匹配一个密码,可以包含任何字符,但仍然满足上述条件。如何执行此操作?

使用此正则表达式:

/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)\S{8,20}$/
我使用了
\S
(任何非空格字符)而不是
\w
(单词字符的意思是
[a-zA-Z0-9.]

使用此正则表达式:

/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)\S{8,20}$/

我使用了
\S
(任何非空格字符)而不是
\w
(单词字符的意思是
[a-zA-Z0-9.]

这将满足您的要求:

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

说明:

  • ^
    匹配字符串的开头
  • (?=.[A-Z])
    需要大写字符
  • (?=.[a-z])
    需要小写字符
  • (?=.*\d)
    需要一个数字
  • {8,}
    要求最小长度为8
注意:与anubhava的答案不同,这允许使用空格字符。如果不需要空白,请按照anubhava的建议使用
\S

编辑:根据@ridgerunner在评论中的精彩观点,这里有一个稍微高效的正则表达式:

/^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\D*\d).{8,}$/

此版本避免了lazy
*
表达式,该表达式在该上下文中测试整个正则表达式时会浪费时间。

这将满足您的要求:

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

说明:

  • ^
    匹配字符串的开头
  • (?=.[A-Z])
    需要大写字符
  • (?=.[a-z])
    需要小写字符
  • (?=.*\d)
    需要一个数字
  • {8,}
    要求最小长度为8
注意:与anubhava的答案不同,这允许使用空格字符。如果不需要空白,请按照anubhava的建议使用
\S

编辑:根据@ridgerunner在评论中的精彩观点,这里有一个稍微高效的正则表达式:

/^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\D*\d).{8,}$/

这个版本避免了懒惰的
*
表达式,这会浪费时间在这个上下文中测试整个正则表达式。

不要在一个正则表达式中完成所有操作。让每一次验证都有自己的检查更具可读性和可维护性

$passes =
    preg_match( '/[A-Z]/', $pw ) && # uppercase char
    preg_match( '/[a-z]/', $pw ) && # lowercase char
    preg_match( '/\d/', $pw ) &&    # digit
    (strlen($pw) > 8);              # at least 8 characters

不要在一个正则表达式中完成所有操作。让每一次验证都有自己的检查更具可读性和可维护性

$passes =
    preg_match( '/[A-Z]/', $pw ) && # uppercase char
    preg_match( '/[a-z]/', $pw ) && # lowercase char
    preg_match( '/\d/', $pw ) &&    # digit
    (strlen($pw) > 8);              # at least 8 characters

将密码必须包含的
\w
更改为其他内容(
\s
),请下次进行搜索。这个问题被问了很多,也被回答了很多。e、 里奇伦纳注意到。但我做了一项研究,写了我自己的正则表达式。只是需要一点帮助来匹配最低要求+其他字符,现在我明白了。这是一个老问题,但作为一个经常遇到奇怪和无用密码要求的人,我必须质疑强制用户输入数字和混合大小写。而不是包含随机数字和字符的短密码。前者容易记忆,计算机难以破解;后者不可能记住,也容易被计算机破解。请将密码必须包含的
\w
更改为其他内容(
\s
),下次请进行搜索。这个问题被问了很多,也被回答了很多。e、 里奇伦纳注意到。但我做了一项研究,写了我自己的正则表达式。只是需要一点帮助来匹配最低要求+其他字符,现在我明白了。这是一个老问题,但作为一个经常遇到奇怪和无用密码要求的人,我必须质疑强制用户输入数字和混合大小写。而不是包含随机数字和字符的短密码。前者容易记忆,计算机难以破解;后者不可能记住,也很容易被计算机破解。请注意,您可以通过将惰性点星更改为更精确的贪婪表达式来提高此正则表达式的效率:
/^(?=[^A-Z]*[A-Z])(?=[^A-Z]*[A-Z])(?=\D*\D)。{8,}$/
@ridgerunner请你向我解释一下你建议的正则表达式是如何更有效的?@ss_百万富翁-嗯,我可以,但不在这里的评论范围内。简单的回答是贪婪表达式需要更少的步骤让正则表达式引擎声明匹配。(懒惰的量词要求每个字符有一个回溯,贪婪的量词可以在一个步骤中消耗掉所有字符。)然而,我可以强烈推荐以下这本书:《正则表达式的效率在哪里》是一本非常详细的书。@ss_百万富翁,正如ridgerunner所说,它很复杂。短版本是默认情况下,
匹配除
\r
\n
之外的所有内容。因此,在将
(?=.*[A-Z])
foo Bar
进行匹配时,正则表达式引擎会在尝试匹配
*
时吞掉整个字符串,然后进行备份,直到它到达
[A-Z]
中的一个字符为止(在本例中为
B
)。另一方面,使用
(?=[^A-Z]*[A-Z])
,则
B
[^A-Z]
不匹配。因此,引擎只是前进通过
foo
,然后匹配
B
。这节省了向前走和回溯的额外步骤。请注意,您可以通过将惰性点星更改为更精确的贪婪表达式来提高此正则表达式的效率:
/^(?=[^A-Z]*[A-Z])(?=[^A-Z]*[A-Z])(?=\D*\D)。{8,}$/
@ridgerunner请您向我解释一下您建议的正则表达式如何更有效