在PHP中生成字母数字字符串
我有一个PHP函数,可以生成给定长度的字母数字字符串。该函数工作正常。但生成的字符串有时包含数字,有时不包含数字。我希望字符串每次都必须由数字和alpha组成。我需要一些建议。以下是函数的代码:在PHP中生成字母数字字符串,php,string,Php,String,我有一个PHP函数,可以生成给定长度的字母数字字符串。该函数工作正常。但生成的字符串有时包含数字,有时不包含数字。我希望字符串每次都必须由数字和alpha组成。我需要一些建议。以下是函数的代码: public static function GenerateAlphaNumString($length=0) { $characterPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
public static function GenerateAlphaNumString($length=0) {
$characterPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characterPool[rand(0, strlen($characterPool) - 1)];
}
return $randomString;
}
公共静态函数GenerateAlphaNumString($length=0){
$characterPool='0123456789abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz';
$randomString='';
对于($i=0;$i<$length;$i++){
$randomString.=$characterPool[rand(0,strlen($characterPool)-1)];
}
返回$randomString;
}
这应该可以做到
$characterPool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
$numberscount = rand(1,$length-1);
for ($i = 0; $i < $numberscount; $i++) {
$randomString .= rand(0,9);
}
for ($i = 0; $i < ($length - $numberscount); $i++) {
$randomString .= $characterPool[rand(0, strlen($characterPool) - 1)];
}
$characterPool='abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz';
$randomString='';
$numberscont=rand(1,$length-1);
对于($i=0;$i<$numberscont;$i++){
$randomString.=rand(0,9);
}
对于($i=0;$i<($length-$numberscont);$i++){
$randomString.=$characterPool[rand(0,strlen($characterPool)-1)];
}
当$length=1时,它总是打印一个字符。在返回字符串之前添加以下内容
If(!preg_match( '/([0-9]+)/', $randomString) {
return self::GenerateAlphaNumString($length);
}
如果字符串中没有数字,只需调用相同的函数,直到有数字为止 您可以这样做:
// Add a quick exit:
if ($length <= 0) return '';
// Produce all characters except the last one:
for ($i = 0; $i < $length-1; $i++) {
$randomString .= $characterPool[rand(0, strlen($characterPool) - 1)];
}
// Check if string contains a digit, if not, reduce range
// for generating last character so it can only be a digit:
$lastRange = preg_match("/\d/", $randomString) ? strlen($characterPool) : 10;
// choose random position, and insert last character in there:
$randomString = substr_replace($randomString, $characterPool[rand(0, $lastRange-1)],
rand(0, $length-1), 0);
return $randomString;
//添加一个快速退出:
如果($length是一个完整的示例,提供灵活性:
<?php
class StringGenerator
{
private $characterPool = [
'numeric' => '0123456789',
'alpha' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
];
function generateRandomString($length, $pool) {
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $this->characterPool[$pool][rand(0, strlen($this->characterPool[$pool]) - 1)];
}
return $randomString;
}
function generateAlphaNumString($length=0, $numeric=0) {
return str_shuffle(
$this->generateRandomString($numeric, 'numeric') .
$this->generateRandomString($length-$numeric, 'alpha')
);
}
}
$generator = new StringGenerator;
for ($c=0; $c<=10; $c++) {
var_dump($generator->generateAlphaNumString(10, 5));
}
有多少个字母和多少个数字?如果$length<2
,则不能同时包含这两个字母和数字。如果假定它是随机的,则不能期望它总是包含数字…还有,rand()
不是真正的随机。数字没有限制。但是字符串应该至少包含一个数字。与现在不同,因为有时它生成的字符串没有任何数字。这往往会将数字集中在字符串的开头,从而使其随机性降低。我认为这有点低效。这是著名的“随机排序算法”…很好!你应该在递归调用之前添加return
。很好。编辑了我的答案。如果效率是一个主要问题,这可能不是最好的解决方案,但第二次迭代的可能性相当小,所以在大多数情况下,我认为这是可行的。谢谢。它工作得很好,很干净。非常感谢。但是我可以rando吗当我被迫输入数字时,将数字的位置最小化?是的,这是可能的。我改进了代码,在随机位置插入最后选择的字符。感谢代码中的更改和注释。注释对我的帮助很大,因为我是一个新手。:)即使对于非新手,注释也是好代码的重要组成部分。很高兴你能欣赏它!这修复了生成的数字的数量(本例中为5),这使得它比原始数字随机性更小。@trincot确实如此,这是我理解OPs问题的方式,尽管我同意这可以从不同的角度来看待。。。没有什么能反对在最后一次调用中随机化数字的数量,尽管……这是一个更好的解决方案
string(10) "J5F4FQX480"
string(10) "Z2g647pO9a"
string(10) "159Mf8GEL3"
string(10) "B5P57I42hN"
string(10) "Us97v5cg80"
string(10) "34VEHY825t"
string(10) "V6Ei5p06s1"
string(10) "YS5noD5127"
string(10) "4dJ4Y4G4q4"
string(10) "C8V7W3Q2G9"
string(10) "gu28g99H9d"