PHP,正则表达式,不允许在密码中使用空格

时间:2016-06-09 20:45:34

标签: php regex

我正在寻找我的问题时间和时间,但找不到一个正常的解决方案,或者可能是我的RegEx系列出了问题。我正在寻找不允许用户在密码中放入空格的部分。密码字段必须包含此正则表达式列表:

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

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

我的RegExp专线:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

^                 # 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 再一次,这些密码很容易猜到,并且使它更容易,你可以将它们存储为纯文本(但请在这里留下链接,以便其他人不在该网站上注册:)。

答案 1 :(得分: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锚点来匹配字符串的结尾更安全,因为$可以在字符串中的最后一行换行符之前匹配。