简单?逻辑缺陷与我的功能

时间:2012-03-13 14:55:29

标签: php logic

我有一个问题,当你阅读我的功能时,它可能会变得明显,但我无法弄清楚该怎么做。

问题是,我需要使用“do,while”,因为我需要“do”的结果,以“while”进行测试。问题是,当while获得所有4个条件返回false时,它会退出,但这会让我的代码变坏。

我需要重新生成代码,直到它不包含任何无法区分的字符。

function make_code(){
    do{
        $prefix         = mt_rand(0, mt_getrandmax());
        $code           = uniqid($prefix);//good to make sure we always have a unique string to work with, even with no seed supplied.
        $sha1           = sha1($code);
        $base_convert   = base_convert($sha1, 16, 36);//expand hex with the rest of the alphabet.
        $substr         = substr($base_convert, 0, 12);//we only want the first 12 characters.
        $strtoupper     = strtoupper($substr);//for aesthetics.
        $str_split      = str_split($strtoupper, 4);//seperate into chunks.
        $voucher_code   = $str_split[0] . self::CS . $str_split[1] . self::CS . $str_split[2];//build
    }
    while(
            (stristr($voucher_code, "o") === false)
         && (stristr($voucher_code, "0") === false)
         && (stristr($voucher_code, "1") === false)
         && (stristr($voucher_code, "i") === false));


    return $voucher_code;
  }
}

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

将这些代码呈现为使这些字符可区分的字体会不会更容易?话虽如此,只需使用正则表达式“简化”多个字符串匹配:

do {
   ...
while (preg_match('/[01lo]/i', $voucher_code));

从使用中消除这些字符只会使你更有可能最终获得重复的凭证。