带有正则表达式的安全密码

时间:2012-10-13 18:58:56

标签: php regex passwords character

我对正则表达非常新,我做了一个研究并得到了一点了解 我需要的是一个符合这些规范的密码

  1. 任何字母字符(至少一个)
  2. 任何数字字符(至少一个)
  3. 没有空格
  4. 特殊字符(0或更多)
  5. 我得到的是这个

    ^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)(?!\S)$
    

    匹配1,2,3规格但不匹配4 我在4上尝试了不同的东西,但是我失败了

    任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:6)

你非常接近。这似乎可以解决您的问题:

preg_match("/^(?=.*[0-9])(?=.*[a-z])(\S+)$/i", $password)

我做了两处修改。

  1. 使用i修饰符(匹配大小写不敏感)稍微缩短一下。这允许删除A-Z`。
  2. 我认为(?!\S)在这里并没有真正帮助。相反,您可以简单地使您的实际匹配仅包含非空格字符(\S+)。这也将立即允许您的密码中的特殊字符(实际上是空格的任何内容)。
  3. 如果您只想允许某组特殊字符,请将\S替换为包含字母,数字和您想要允许的所有字符的字符类。顺便说一句,如果您想确保密码具有特定的最小长度,则可以将+更改为{8,}

答案 1 :(得分:3)

不需要一个奇怪的正则表达式。特别是因为您要确保密码包含不包含,并且无论它出现在何处都无关紧要:

<?php

/**
 * Validates the password:
 *  * Has at least one alphabet character
 *  * Has at least one digit
 *  * Has no spaces
 *
 * @param string $password  Password to validate
 *
 * @return bool             Whether $password is valid or not.
 */
function validate_password($password) {
    //If no alphabet characters found, return false.
    if (!preg_match("/[a-z]/i", $password)) {
        return false;
    }
    //If no digits found, return false.
    if (!preg_match("/[0-9]/", $password)) {
        return false;
    }
    //If a space is found, return false.
    if (strpos($password, " ") !== false) {
        return false;
    }
    //Special characters are optional, so no checking.
    //If nothing happened so far, the password is valid. Return true.
    return true;
}

var_dump(
    validate_password("test"),          //False, no digits
    validate_password("test123 test"),  //False, space
    validate_password("123456"),        //False, no alphabet
    validate_password("test1234")       //True
);

答案 2 :(得分:1)

使用三个单独的正则表达式 - 一个用于检查是否存在字母字符,一个用于检查是否存在数字,另一个用于检查是否存在空格。虽然可以使用单个正则表达式完成所有操作,但每个附加条件都会显着增加正则表达式的复杂性。

preg_match("/[a-z]/i", $passwd) && preg_match("/[0-9]/", $passwd) && !preg_match("/ /", $passwd)

答案 3 :(得分:0)

似乎是这样的:

^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S*$)(?=[0-9a-zA-Z.,;~!@#$%^&*()\-+=\\\]+$)

添加您需要的所有特殊字符。

修改:回复一些评论,这是测试运行的结果:

<?php

$re = '/^(?=.*[0-9])(?=.*[A-Z])(?=\S*$)(?=[0-9a-zA-Z.,;~!@#$%^&*()\-+=\\\]+$)/';

$s = 'A2x.';

echo preg_match($re, $s);

?>

在Ubuntu下使用CLI进行测试:

me@mymachine$ php _.php
1

它取决于0的值1$s;)