5

私は正規表現に非常に慣れていません。調査を行い、必要なものはそれらの仕様に一致するパスワードであることを少し理解しました

  1. 任意の英字 (少なくとも 1 文字)
  2. 任意の数字 (少なくとも 1 文字)
  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)

2 つの変更を加えました。

  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

3 つの個別の正規表現を使用します。1 つは英字があることを確認するため、もう 1 つは数字があることを確認するため、もう 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

そして、それは;)の値に応じて取得0または取得します1$s

于 2012-10-13T19:43:07.217 に答える