我在我的代码中发现了一些意想不到的行为,因此提供了两个示例来演示正在发生的事情,并且无法从中找出问题。我发现对我来说很奇怪,也许我错过了一些东西。
目标:创建随机字符串并避免在数组中指定任何内容。
在下面的示例中,我有两种测试方法。
首先,我有一个函数,从指定的字符($字符)创建一个随机字符串然后我有一个数组($ avoid)(这里指定了双字母)然后循环并通知你代码是否有效,它确实找到了数组中指定的内容。
这似乎有效,但是如果发生相同的触发器,我修改了第二个函数以尝试生成新的随机字符串。这样可以避免在数组中包含任何字符串。
这部分似乎不起作用..我不确定如何从这里修改它,但我必须遗漏一些东西。运行代码是有效的,但它会抓住一些东西并且错过其他时间......我不希望代码。
function getrandom($loopcount)
{
$loopcount++;
$length = 20;
$characters = 'abc';
$string = '';
for ($p = 0; $p < $length; $p++)
$string.= $characters[ mt_rand( 0,strlen($characters) ) ];
$avoid = array(
'aa',
'bb',
'cc'
);
foreach ($avoid as $word)
if ( stripos($string,$word) )
$string = 'Double '.$word.' Detected:'.$string;
return '<h1 style="color:blue;">'.$string.'<h1>';
}
echo getrandom(0);
echo getrandom(0);
echo getrandom(0);
function getrandom2($loopcount)
{
$loopcount++;
$length = 20;
$characters = 'abc';
$string = '';
for ($p = 0; $p < $length; $p++)
$string.= $characters[ mt_rand( 0,strlen($characters) ) ];
$avoid = array(
'aa',
'bb',
'cc'
);
foreach ($avoid as $word)
if ( stripos($string,$word) )
$string = getrandom2($loopcount);
return '<h1 style="color:green;">'.$string.'<h1>';
}
echo getrandom2(0);
echo getrandom2(0);
echo getrandom2(0);
答案 0 :(得分:1)
我用过这个
function randomToken($length)
{
srand(date("s"));
$possible_charactors = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$string = "";
while(strlen($string)<$length)
{
$string .= substr($possible_charactors, rand()%strlen($possible_charactors),1);
}
return($string);
}
答案 1 :(得分:0)
您需要使用tripple运算符检查stripos()
,否则您的if会将位置0处的匹配项解释为false(1)
foreach ($avoid as $word){
if ( stripos($string,$word) !== FALSE){
$string = getrandom2($loopcount);
}
}
(1)http://php.net/manual/en/language.operators.comparison.php
答案 2 :(得分:0)
以下对我有用:
print gen_rand_str_avoid('abc', 20, array('aa', 'bb', 'cc'));
function gen_rand_str($chars, $length) {
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $str;
}
function gen_rand_str_avoid($chars, $length, array $avoids) {
while (true) {
$str = gen_rand_str($chars, $length);
foreach ($avoids as $avoid) {
if (stripos($str, $avoid) !== false) {
continue 2;
}
}
break;
}
return $str;
}