00001 <?php 00002 /*************************************************************************** 00003 * Copyright (C) 2004-2008 by Dmitry E. Demidov * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU Lesser General Public License as * 00007 * published by the Free Software Foundation; either version 3 of the * 00008 * License, or (at your option) any later version. * 00009 * * 00010 ***************************************************************************/ 00011 00015 final class CodeGenerator 00016 { 00017 private $length = null; 00018 00019 private $lowerAllowed = true; 00020 private $upperAllowed = true; 00021 private $numbersAllowed = true; 00022 private $similarAllowed = true; 00023 00024 static private $similarSymbols = array('0', 'o', '1', 'l'); 00025 00029 public static function create() 00030 { 00031 return new self; 00032 } 00033 00034 public function generate() 00035 { 00036 $code = null; 00037 00038 for ($i = 0; $i < $this->length; ++$i) 00039 $code .= $this->generateOneSymbol(); 00040 00041 return $code; 00042 } 00043 00047 public function setLength($length) 00048 { 00049 $this->length = $length; 00050 00051 return $this; 00052 } 00053 00057 public function setLowerAllowed($lowerAllowed = true) 00058 { 00059 $this->lowerAllowed = $lowerAllowed; 00060 00061 return $this; 00062 } 00063 00067 public function setUpperAllowed($upperAllowed = true) 00068 { 00069 $this->upperAllowed = $upperAllowed; 00070 00071 return $this; 00072 } 00073 00077 public function setSimilarAllowed($similarAllowed = true) 00078 { 00079 $this->similarAllowed = $similarAllowed; 00080 00081 return $this; 00082 } 00083 00087 public function setNumbersAllowed($numbersAllowed = true) 00088 { 00089 $this->numbersAllowed = $numbersAllowed; 00090 00091 return $this; 00092 } 00093 00097 public function setCharactersAllowed($charactersAllowed = true) 00098 { 00099 $this->setLowerAllowed($charactersAllowed); 00100 $this->setUpperAllowed($charactersAllowed); 00101 00102 return $this; 00103 } 00104 00105 private function generateOneSymbol() 00106 { 00107 $variants = array(); 00108 00109 Assert::isTrue( 00110 $this->lowerAllowed 00111 || $this->upperAllowed 00112 || $this->numbersAllowed, 00113 00114 'what exactly should i generate?' 00115 ); 00116 00117 do { 00118 if ($this->lowerAllowed) 00119 $variants[] = $this->randomChar(); 00120 00121 if ($this->upperAllowed) 00122 $variants[] = strtoupper($this->randomChar()); 00123 00124 if ($this->numbersAllowed) 00125 $variants[] = $this->randomNumber(); 00126 00127 shuffle($variants); 00128 00129 $symbol = $variants[0]; 00130 00131 } while ( 00132 (!$this->similarAllowed) 00133 && (in_array($symbol, self::$similarSymbols)) 00134 ); 00135 00136 return $symbol; 00137 } 00138 00139 private function randomNumber() 00140 { 00141 return mt_rand(0,9); 00142 } 00143 00144 private function randomChar() 00145 { 00146 return chr(mt_rand(ord('a'), ord('z'))); 00147 } 00148 } 00149 ?>