【问题标题】:PHP, Regular Expression, don't allow whitespace in passwordPHP,正则表达式,密码中不允许有空格
【发布时间】:2016-06-09 20:45:34
【问题描述】:

我一直在寻找我的问题,但找不到可以正常工作的解决方案,或者我的 RegEx 行有问题。我正在寻找不允许用户在密码中输入空格的部分。密码字段必须要求此正则表达式列表:

  • 至少 1 个小写字母 [a-z]。
  • 至少 1 个大写字母 [A-Z]。
  • 至少 1 个数字字符 [0-9]。
  • 密码不应包含任何特殊字符、符号或空格。
  • 密码长度必须至少为 8 个字符。最大允许长度为 30 个字符。

现在我已经生成了包含所有内容的 RegEx 行,但没有包含空格的部分。如果有人知道这条线有什么问题,请纠正我并告诉我如何解决问题。顺便说一句,我试过 [\S] 但不起作用,我不知道为什么。

我的正则表达式行:

^(?=(?:.*[A-Z]){1,})(?=(?:.*[a-z]){1,})(?=(?:.*\d){1,})(?!(?:.*[!@#$%^&*()\-_=+{};:,<.>]))(.{8,30})$

这里是使用此 RegEx 的有效和无效密码的完整演示:Demo

感谢所有回答和帮助我的人。

【问题讨论】:

标签: php regex


【解决方案1】:

我不知道您如何尝试使用 \S,但这正是您可以利用和使用的,而不是主要消费模式中的 .

\A                 # Start of string
  (?=[^A-Z]*[A-Z]) # Require at least one uppercase letter 
  (?=[^a-z]*[a-z]) # Require at least one lowercase letter
  (?=\D*\d)        # Require at least one digit
  (?![^!@#$%^&*()\-_=+{};:,<.>]*[!@#$%^&*()\-_=+{};:,<.>]) # No special chars
 \S{8,30}          # Match 8 to 30 non-whitespace chars
\z                 # Unambiguous end of string.

查看regex demo(演示正则表达式有点不同,因为测试是针对多行字符串执行的,这是您应该使用的。)

在这里,我在前瞻中使用了对比原理,并删除了不必要的非捕获组。

此外,使用\z 锚来匹配字符串的结尾更安全,因为$ 可以在字符串中的最后一个换行符之前匹配。

【讨论】:

    【解决方案2】:

    正如其他人所说,您的规范非常薄弱。
    如果您坚持,您可以提出以下使用相反对的表达式:

    ^                 # the beginning
    (?=[^a-z]*[a-z])  # at least one lower case
    (?=[^A-Z]*[A-Z])  # at least one upper case
    (?=\D*\d)         # at least one digit
    [\da-zA-Z]{8,30}  # digits and characters from a-z
    $                 # the end
    

    a demo on regex101.com


    PHP 中,这将是:
    <?php
    $regex = '~
                ^                 # the beginning
                (?=[^a-z]*[a-z])  # at least one lower case
                (?=[^A-Z]*[A-Z])  # at least one upper case
                (?=\D*\d)         # at least one digit
                [\da-zA-Z]{8,30}  # digits and characters from a-z
                $                 # the end
             ~x';
    
    $password = "Someveryweakpassword123";
    if (preg_match($regex, $password)) {
        echo "Yes, it does";
    }
    ?>
    

    a demo on ideone.com
    再一次,这些密码很容易被猜到,而且为了更容易,您还可以将它们存储为纯文本(但请在此处留下链接,以便其他人不要在该网站上注册:)。

    【讨论】:

    • 使用否定前瞻禁止特殊字符的要点是主要消费模式仍然可以允许 Unicode 字母和其他符号。这就是为什么我建议保持原样。
    • 非常感谢您的回答!你是对的,和其他答案一样。我知道这会使密码看起来很周,所以我会尝试改变它,我会删除带有特殊字符的表达式。
    • @WiktorStribiżew:没错,我什至会更进一步,建议一起更改规范:)
    猜你喜欢
    • 2016-10-08
    • 2011-08-27
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2014-03-13
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多