如何生成至少包含一个数字的唯一字母数字字符串?

How to generate a unique alphanumeric string with atleast a number?

我需要生成一个长度为 4 的随机字符串(有效字符串是 1ABC, A12D...)。字符串必须包含至少 1 个数字,其余可以是 [A-Z].

方法一:

protected function generate(int $length = 4): array
{
    $randomString = '';

    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    for ($i = 0; $i < $length; $i++) {
        $index = random_int(0, strlen($characters) - 1);
        $randomString .= $characters[$index];
    }

    $uppercase = preg_match('@[A-Z]@', $randomString);
    $number = preg_match('@[\d]@', $randomString);


    if (!$uppercase || !$number) {
        $this->generate();
    }

    return $randdomString;
}

方法二:

echo substr(str_shuffle('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'),1, 4);

大多数时候,它给我正确的答案,但在某些情况下,它 return 我只有字母值(这是我最近得到的结果 XFJG

有人可以帮忙吗?

如果两个条件之一为真,则 OR || 将 return 为真,因此如果没有数字,它将通过 if 子句。

您可以改为检查两个条件是否都为真:

if ($number && $uppercase) {
    // do something with $values
}

运行 this again $func(); inside the if clause, will 运行 the function again generating a new string and returns $randomString; from the function .

如果要return测试过的字符串,可以return已经测试过的$values

编辑

如果您不想 return 仅使用 A-Z 字符或仅匹配数字,您可以使用 ^\d+$^[A-Z]+$[更新模式以仅匹配数字或仅匹配 A-Z 字符

如果条件为真,则进行递归调用。

protected function generate(int $length = 4): string
{
    $randomString = '';

    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    for ($i = 0; $i < $length; $i++) {
        $index = random_int(0, strlen($characters) - 1);
        $randomString .= $characters[$index];
    }

    $uppercase = preg_match('@^[A-Z]+$@', $randomString);
    $number = preg_match('@^\d+$@', $randomString);


    if ($uppercase || $number) {
        $randomString = $this->generate();
    }

    return $randomString;
}

看到一个PHP demo