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

I have a problem, it'll probably become apparent as you read my function, but I can't figure out what to do.

The issue is, I need to use "do, while", because I need the result of "do", to test in "while". The problem is, when the while gets all 4 conditions returning false, it quits, but that leaves me with a bad code.

I need to regenerate a code until it contains no indistinguishable characters.

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;
  }
}

Thanks for any help offered.

Wouldn't it be easier to just present this code in a font that DOES make those characters distinguishable? That being said, simply use a regex to "simplify" your multiple string matches:

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

Eliminating those characters from usage just makes it that much more likely you'll end up with a duplicate voucher.