PHP,正则表达式,don';密码中不允许空白

PHP,正则表达式,don';密码中不允许空白,php,regex,Php,Regex,我一直在寻找我的问题,但找不到一个好的解决方案,或者我的正则表达式行出了问题。我正在寻找的部分,用户将不允许在密码中添加空格。密码字段必须需要以下正则表达式列表: 至少1个小写字母[A-z] 至少1个大写字母[A-Z] 最少1个数字字符[0-9] 密码不应包含任何特殊字符、符号或空格 密码长度必须至少为8个字符。允许的最大长度为30个字符 现在我已经生成了包含所有内容的正则表达式行,但没有包含带空格的部分。如果有人知道这条线出了什么问题,请纠正我并告诉我如何解决这个问题。顺便说一句,我试过[

我一直在寻找我的问题,但找不到一个好的解决方案,或者我的正则表达式行出了问题。我正在寻找的部分,用户将不允许在密码中添加空格。密码字段必须需要以下正则表达式列表:

  • 至少1个小写字母[A-z]
  • 至少1个大写字母[A-Z]
  • 最少1个数字字符[0-9]
  • 密码不应包含任何特殊字符、符号或空格
  • 密码长度必须至少为8个字符。允许的最大长度为30个字符
现在我已经生成了包含所有内容的正则表达式行,但没有包含带空格的部分。如果有人知道这条线出了什么问题,请纠正我并告诉我如何解决这个问题。顺便说一句,我试过[\S],但不起作用,我不知道为什么

我的RegExp行:

^(?=(?:.*[A-Z]){1,})(?=(?:.*[a-z]){1,})(?=(?:.*\d){1,})(?!(?:.*[!@#$%^&*()\-_=+{};:,<.>]))(.{8,30})$
^((?:.[A-Z]){1,})(?=(?:.[A-Z]){1,})(?=(?:.*\d){1,})(?!(?:.[!@$%^&*()\-{};:,])(.{8,30})$
以下是使用此正则表达式的有效和无效密码的完整演示:


感谢所有这些回答和帮助。

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

^                 # 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
看。
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";
}
?>

请参阅。

同样,这些密码很容易猜到,而且更容易,您也可以将它们以纯文本形式存储(但请在此处留下一个链接,让其他人不要在该网站上注册:)。

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

^                 # 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
看。
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";
}
?>

请参阅。

再一次,这些密码很容易猜到,而且更容易,您也可以将它们存储为纯文本(但请在此处留下一个链接,让其他人不要在该网站注册:)。

我不知道您是如何尝试使用
\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.
\A#字符串的开头
(?=[^A-Z]*[A-Z])至少需要一个大写字母
(?=[^a-z]*[a-z])#至少需要一个小写字母
(?=\D*\D)#至少需要一位数字
(?![^!@$%^&*()\-\+{};:,]*[!@$^&*()\-\+{};:,])无特殊字符
\S{8,30}匹配8到30个非空白字符
\z#字符串的明确结尾。
请参阅(演示正则表达式有点不同,因为测试是针对多行字符串执行的,这里是您应该使用的。)

在这里,我在lookaheads中使用了对比原则,删除了不必要的非捕获组


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

我不知道您是如何尝试使用
\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.
\A#字符串的开头
(?=[^A-Z]*[A-Z])至少需要一个大写字母
(?=[^a-z]*[a-z])#至少需要一个小写字母
(?=\D*\D)#至少需要一位数字
(?![^!@$%^&*()\-\+{};:,]*[!@$^&*()\-\+{};:,])无特殊字符
\S{8,30}匹配8到30个非空白字符
\z#字符串的明确结尾。
请参阅(演示正则表达式有点不同,因为测试是针对多行字符串执行的,这里是您应该使用的。)

在这里,我在lookaheads中使用了对比原则,删除了不必要的非捕获组


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

允许用户使用他们想要的换行符。尝试顺便说一句,您是如何尝试
[\S]
的?
密码不应包含任何特殊字符、符号
为什么不?禁止空格、特殊字符和强制执行最大长度都是让用户密码更弱、更容易破解的好方法。让他们使用他们想要的密码,他们想要多长时间。@MartinC。你应该告诉制作规范的人它是有缺陷的。允许用户使用他们想要的。尝试顺便说一句,您是如何尝试
[\S]
的?
密码不应包含任何特殊字符、符号
为什么不?禁止空格、特殊字符和强制执行最大长度都是让用户密码更弱、更容易破解的好方法。让他们使用他们想要的密码,他们想要多长时间。@MartinC。你应该告诉制作这个规范的人它是有缺陷的。使用否定前瞻禁止特殊字符的意义在于,主要的消费模式仍然可以允许Unicode字母和其他符号。这就是为什么我建议保持原样。非常感谢你的回答!你是对的,和其他答案一样。我知道这会使密码看起来非常糟糕,所以我会尝试更改密码,并删除带有特殊字符的表达式。@WiktorStribiżew:没错,我甚至更进一步,并建议一起修改规范:)使用否定前瞻禁止特殊字符的要点是,主要的消费模式仍然可以允许Unicode字母和其他符号。这就是为什么我建议保持原样。非常感谢你的回答!你是对的,和其他答案一样。我知道这会使密码看起来非常糟糕,所以我会尝试更改密码,并删除带有特殊字符的表达式。@WiktorStribiżew:没错,我甚至会进一步建议一起更改规范:)