5

我对正则表达式非常陌生,我进行了研究并稍微了解了我需要的是符合这些规范的密码

  1. 任何字母字符(至少一个)
  2. 任何数字字符(至少一个)
  3. 没有空间
  4. 特殊字符(0 个或多个)

我要做的是这个

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

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

谁能帮我 ?

4

4 回答 4

6

你很亲密。这似乎可以解决您的问题:

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

我做了两个改变。

  1. i通过使用修饰符(不区分大小写)来缩短一点。这允许删除 AZ`。
  2. 我认为这里(?!\S)并没有真正的帮助。相反,您可以简单地使您的实际匹配只包含非空格字符(\S+)。这也将立即允许您的密码中包含特殊字符(除了空格之外的任何内容)。

如果您只想允许特定的一组特殊字符,请将 替换为\S包含字母、数字和您希望允许的所有字符的字符类。顺便说一句,如果您想确保密码具有一定的最小长度,您可以将其更改+{8,}例如。

于 2012-10-13T20:25:00.263 回答
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
);
于 2012-10-13T20:20:35.930 回答
1

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

preg_match("/[a-z]/i", $passwd) && preg_match("/[0-9]/", $passwd) && !preg_match("/ /", $passwd)
于 2012-10-13T20:11:11.597 回答
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

它得到01取决于$s;)

于 2012-10-13T19:43:07.217 回答