/** * Transliterate UTF8 text to lowercase 7bit ASCII, 0-9a-z * * @param string $str * @return string */ public static function clean($str) { $str = mb_strtolower(text::strip_ascii_ctrl($str)); if (!text::is_ascii($str)) { $str = strtolower(text::transliterate_to_ascii($str)); } if (!text::is_ascii($str)) { $str = text::strip_non_ascii($str); } return $str; // return strtolower(iconv(Kohana::CHARSET, 'ASCII//TRANSLIT//IGNORE', $str)); }
/** * Tests the text::is_ascii() function. * @dataProvider is_ascii_provider * @group core.helpers.text.is_ascii * @test */ public function is_ascii($str, $expected_result) { $result = text::is_ascii($str); $this->assertEquals($expected_result, $result); }
/** * Strips whitespace (or other UTF-8 characters) from the end of a string. * @see http://php.net/rtrim * * @author Andreas Gohr <*****@*****.**> * * @param string input string * @param string string of characters to remove * @return string */ public static function rtrim($str, $charlist = NULL) { if ($charlist === NULL) { return rtrim($str); } if (text::is_ascii($charlist)) { return rtrim($str, $charlist); } $charlist = preg_replace('#[-\\[\\]:\\\\^/]#', '\\\\$0', $charlist); return preg_replace('/[' . $charlist . ']++$/uD', '', $str); }
/** * Recursively cleans arrays, objects, and strings. Removes ASCII control * codes and converts to UTF-8 while silently discarding incompatible * UTF-8 characters. * * @param string string to clean * @return string */ public static function clean($str) { if (is_array($str) or is_object($str)) { foreach ($str as $key => $val) { // Recursion! $str[Input::clean($key)] = Input::clean($val); } } elseif (is_string($str) and $str !== '') { // Remove control characters $str = text::strip_ascii_ctrl($str); if (!text::is_ascii($str)) { // Disable notices $ER = error_reporting(~E_NOTICE); // iconv is expensive, so it is only used when needed $str = iconv(Kohana::CHARSET, Kohana::CHARSET . '//IGNORE', $str); // Turn notices back on error_reporting($ER); } } return $str; }
/** * Generates a random string of a given type and length. * * @param string a type of pool, or a string of characters to use as the pool * @param integer length of string to return * @return string * * @tutorial alnum alpha-numeric characters * @tutorial alpha alphabetical characters * @tutorial hexdec hexadecimal characters, 0-9 plus a-f * @tutorial numeric digit characters, 0-9 * @tutorial nozero digit characters, 1-9 * @tutorial distinct clearly distinct alpha-numeric characters */ public static function random($type = 'alnum', $length = 8) { $utf8 = FALSE; switch ($type) { case 'alnum': $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; case 'alpha': $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; case 'hexdec': $pool = '0123456789abcdef'; break; case 'numeric': $pool = '0123456789'; break; case 'nozero': $pool = '123456789'; break; case 'distinct': $pool = '2345679ACDEFHJKLMNPRSTUVWXYZ'; break; default: $pool = (string) $type; $utf8 = !text::is_ascii($pool); break; } // Split the pool into an array of characters $pool = $utf8 === TRUE ? utf8::str_split($pool, 1) : str_split($pool, 1); // Largest pool key $max = count($pool) - 1; $str = ''; for ($i = 0; $i < $length; $i++) { // Select a random character from the pool and add it to the string $str .= $pool[mt_rand(0, $max)]; } // Make sure alnum strings contain at least one letter and one digit if ($type === 'alnum' and $length > 1) { if (ctype_alpha($str)) { // Add a random digit $str[mt_rand(0, $length - 1)] = chr(mt_rand(48, 57)); } elseif (ctype_digit($str)) { // Add a random letter $str[mt_rand(0, $length - 1)] = chr(mt_rand(65, 90)); } } return $str; }