1

固定長 10 文字のランダムな文字列を生成する必要があります。ただし、少なくとも 1 つの小文字、1 つの大文字、数字、およびこれらの記号の 1 つが含まれている必要があります: `~!@#$%^&*()_-+={}[]|:;" '<>,.?/

以前にこの単純な関数を使用しました:

function generateRandomString($length = 10)
{
    $characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/';
    $result = '';
    for ($i = 0; $i < $length; $i++)
        $result .= $characters[rand(0, strlen($characters) - 1)];
    return $result;
}

ただし、この関数には、必要な各文字タイプが少なくとも 1 つ含まれていません。別のルートに行っても:

function generateRandomString($length = 10)
{
    $dig = '0123456789';
    $low = 'abcdefghijklmnopqrstuvwxyz';
    $upp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $sym = '`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/';
    $result = '';

    for ($i = 0; $i < $length; $i++)
    {
       $foo = rand(1,4);
       switch ($foo)
       {
           case 1:
               $result .= $dig[rand(0, strlen($dig)-1)];
               break;
           case 2:
               $result .= $low[rand(0, strlen($low)-1)];
               break;
           // etc.
       }
        return $result;
    }

これには、必ずしもそれぞれの少なくとも 1 つが含まれているとは限りません。すべての文字をランダムに配置する必要があります。そのため、どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

5

PHP についてはよくわかりませんが、次のようなことができると思います (構文エラーを許してください)。

$result = "";
$result .= $dig[rand(0, strlen($dig) - 1];
$result .= $low[rand(0, strlen($low) - 1];
$result .= $upp[rand(0, strlen($upp) - 1];
$result .= $sym[rand(0, strlen($sym) - 1];

// at this point, you have one of each
// Go through your for loop 6 more times, and then finally:

$result = str_shuffle($result)

それが役立つことを願っています。 str_shuffle 使えそうです。

于 2013-05-25T17:02:07.650 に答える
2

リストを作成してから使用できますstr_shuffle。これは単純化してもう少しうまく書くことができると確信していますが、これは機能します。

各キャラクターの特定の割合を持つことができるように、パーセンテージ メソッドを追加しました。

function generateRandomString($length = 10) {
    $result = getRandomString(.2 * $length, '0123456789');
    $result .= getRandomString(.3 * $length, 'abcdefghijklmnopqrstuvwxyz');
    $result .= getRandomString(.3 * $length, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    $result .= getRandomString(.2 * $length, '`~!@#$%^&*()_-+={}[]|:;"\'<>,.?/');

    $str_len = strlen($result);
    if($str_len != $length) $result .= getRandomString($length - $str_len, 'abcdefghijklmnopqrstuvwxyz');

    return str_shuffle($result);
}

function getRandomString($length, $characters) {
    $result = '';
    $strlen = strlen($characters);
    for($i = 0; $i < floor($length); $i++) $result .= $characters[rand(0, $strlen - 1)];

    return $result;
}

echo generateRandomString(31);
于 2013-05-25T17:13:34.497 に答える