我正在嘗試制作一個“特殊”字串生成器,并為您想要的字符進行自定義選擇。當您呼叫此函式時,在代碼中很快:
generateRandomString(length, [special characters], [numbers], [lower characters], [upper characters]);
例如: generateRandomString(5, true, true, true, true);
代碼最多應為 5 個字符,包含字母、數字和特殊字符...例如:fE3%!
但是為每個活躍的布林值給我 5 個隨機字串,所以如果它是 4,我將回傳 20 個字符而不是 5 個
這是我做錯了什么的代碼?
function generateRandomString($length, $special, $numbers, $upper, $lower)
{
//$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$characters["special"] = "!%";
$characters["numbers"] = "01";
$characters["upper"] = "ABC";
$characters["lower"] = "abc";
$randomString = '';
for ($i = 0; $i < $length; $i )
{
if($special)
{
$randomString .= $characters["special"][rand(0, strlen($characters["special"]) - 1)];
}
if($numbers)
{
$randomString .= $characters["numbers"][rand(0, strlen($characters["numbers"]) - 1)];
}
if($upper)
{
$randomString .= $characters["upper"][rand(0, strlen($characters["upper"]) - 1)];
}
if($lower)
{
$randomString .= $characters["lower"][rand(0, strlen($characters["lower"]) - 1)];
}
}
return $randomString;
}
uj5u.com熱心網友回復:
您應該首先根據給定的引數構建有效字符范圍,然后才構建隨機字串。
添加了驗證器以確保每個所需組中至少有一個字符存在于隨機字串中。
function generateRandomString($length, $special, $numbers, $upper, $lower)
{
//$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$characters["special"] = "!%";
$characters["numbers"] = implode('', range(0, 9));
$characters["upper"] = implode('', range('A', 'Z'));
$characters["lower"] = implode('', range('a', 'z'));
$charactersSet = '';
$validators = [];
$randomString = '';
if ($special) {
$charactersSet .= $characters["special"];
$validators[] = '/[' . preg_quote($characters["special"]) . ']/';
}
if ($numbers) {
$charactersSet .= $characters["numbers"];
$validators[] = '/\d/';
}
if ($upper) {
$charactersSet .= $characters["upper"];
$validators[] = '/[A-Z]/';
}
if ($lower) {
$charactersSet .= $characters["lower"];
$validators[] = '/[a-z]/';
}
for ($i = 0; $i < $length; $i ) {
$randomString .= $charactersSet[rand(0, strlen($charactersSet) - 1)];
}
foreach ($validators as $pattern) {
if (preg_match($pattern, $randomString) === 0) {
$randomString = generateRandomString($length, $special, $numbers, $upper, $lower);
break;
}
}
return $randomString;
}
uj5u.com熱心網友回復:
此解決方案在每次迭代中選擇一個隨機字符范圍,然后從該字符范圍中選擇一個隨機字母。
function generateRandomString($length, $special, $numbers, $upper, $lower)
{
$alphabet = [
'`~!@#$%^&*()_ -=[]{};\':",./<>?',
'0123456789',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
];
$allowable = [];
if ($special)
$allowable[] = 0;
if ($numbers)
$allowable[] = 1;
if ($upper)
$allowable[] = 2;
if ($lower)
$allowable[] = 3;
$output = '';
for ($i = 0; $i < $length; $i) {
$which = $allowable[array_rand($allowable)];
$alphabet_size = strlen($alphabet[$which])-1;
$rand_character = rand(0, $alphabet_size);
$output .= $alphabet[$which][$rand_character];
}
return $output;
}
uj5u.com熱心網友回復:
嘗試將 for 回圈更改為 while 回圈,如下所示:
function generateRandomString($length, $special, $numbers, $upper, $lower)
{
//$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$characters["special"] = "!%";
$characters["numbers"] = "01";
$characters["upper"] = "ABC";
$characters["lower"] = "abc";
$randomString = '';
while(strlen($randomString) <= $length)
{
if($special)
{
$randomString .= $characters["special"][rand(0, strlen($characters["special"]) - 1)];
}
if($numbers && strlen($randomString) <= $length)
{
$randomString .= $characters["numbers"][rand(0, strlen($characters["numbers"]) - 1)];
}
if($upper && strlen($randomString) <= $length)
{
$randomString .= $characters["upper"][rand(0, strlen($characters["upper"]) - 1)];
}
if($lower && strlen($randomString) <= $length)
{
$randomString .= $characters["lower"][rand(0, strlen($characters["lower"]) - 1)];
}
}
return $randomString;
}
更新:(例如長度等于 5)如果我們沒有 5 個步驟,則不會中斷 while 回圈為每一步檢查字串長度是否不是 5 還檢查每個嵌套條件是否字串等于 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/513628.html
標籤:php
