Try following code:
<?php
//mutates given user name, producing possibly incorrect username
function mutate($uname)
{
$x = str_split($uname);
//sort with custom function, that tries to produce only slightly
//random user name (as opposed to completely shuffling)
uksort($x, function($a, $b)
{
$chance = mt_rand(0, 3);
if ($chance == 0)
{
return $b - $a;
}
return $a - $b;
});
//insert randomly dashes and underscores
//(multiplication for getting more often 0 than 3)
$chance = mt_rand(0, 3) * mt_rand(0, 3) / 3.;
for ($i = 0; $i < $chance; $i ++)
{
$symbol = mt_rand() & 1 ? '-' : '_';
$pos = mt_rand(0, count($x));
array_splice($x, $pos, 0, $symbol);
}
return join('', $x);
}
//validates the output so you can check whether new user name is correct
function validate($uname)
{
//does not start nor end with alphanumeric characters
if (!preg_match('/^[a-zA-Z0-9].*[a-zA-Z0-9]$/', $uname))
{
return false;
}
//does contain more than 3 symbols
$noSymbols = preg_replace('/[^a-zA-Z0-9]+/', '', $uname);
if (strlen($uname) - strlen($noSymbols) > 3)
{
return false;
}
//shorter than 6 characters
if (strlen($uname) < 6)
{
return false;
}
return true;
}
Example usage:
$uname = 'bingo';
$desired_num = 5;
$sug = [];
while (count($sug) < $desired_num)
{
$mut = mutate($uname);
if (!validate($mut))
{
continue;
}
if (!in_array($mut, $sug) and $mut != $uname)
{
$sug []= $mut;
}
}
print_r($sug);
Example output:
Array
(
[0] => i-g-obn
[1] => bi-gno
[2] => bi_ngo
[3] => i-bnog
[4] => bign-o
)