12 марта 2009, 05:08 более года назад
Конвертация кириличной строки (Cyrillic UTF8) в транслит
Это обновлённый вариант
Старый вариант, рабоатет на пхп < 5.1.2
function Transliterate($string){ $cyr=array( "Щ", "Ш", "Ч","Ц", "Ю", "Я", "Ж","А","Б","В", "Г","Д","Е","Ё","З","И","Й","К","Л","М","Н", "О","П","Р","С","Т","У","Ф","Х","Ь","Ы","Ъ", "Э","Є", "Ї","І", "щ", "ш", "ч","ц", "ю", "я", "ж","а","б","в", "г","д","е","ё","з","и","й","к","л","м","н", "о","п","р","с","т","у","ф","х","ь","ы","ъ", "э","є", "ї","і" ); $lat=array( "Shch","Sh","Ch","C","Yu","Ya","J","A","B","V", "G","D","e","e","Z","I","y","K","L","M","N", "O","P","R","S","T","U","F","H","", "Y","" ,"E","E","Yi","I", "shch","sh","ch","c","Yu","Ya","j","a","b","v", "g","d","e","e","z","i","y","k","l","m","n", "o","p","r","s","t","u","f","h", "", "y","" ,"e","e","yi","i" ); for($i=0; $i<count($cyr); $i++) { $c_cyr = $cyr[$i]; $c_lat = $lat[$i]; $string = str_replace($c_cyr, $c_lat, $string); } $string = preg_replace( "/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]e/", "\${1}e", $string); $string = preg_replace( "/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]/", "\${1}'", $string); $string = preg_replace("/([eyuioaEYUIOA]+)[Kk]h/", "\${1}h", $string); $string = preg_replace("/^kh/", "h", $string); $string = preg_replace("/^Kh/", "H", $string); return $string; } function encodestring($string){ $string = str_replace(array(" ",""","&","<",">"), array(" "), $string); $string = preg_replace("/[_\s\.,?!\[\](){}]+/", "_", $string); $string = preg_replace("/-{2,}/", "--", $string); $string = preg_replace("/_-+_/", "--", $string); $string = preg_replace("/[_\-]+$/", "", $string); $string = Transliterate($string); $string = ToLower($string); $string = preg_replace("/j{2,}/", "j", $string); $string = preg_replace("/[^0-9a-z_\-]+/", "", $string); return $string; }
Старый вариант, рабоатет на пхп < 5.1.2
// функция для разложения строки в массив // аналог стандартной str_split, но для работы с UTF-8 // проверено на многих языках function str_split_utf8($str) { $split = 1; $array = array(); for ($i=0; $i < strlen($str); ){ $value = ord($str[$i]); if($value > 127){ if ($value >= 192 && $value <= 223) $split = 2; elseif ($value >= 224 && $value <= 239) $split = 3; elseif ($value >= 240 && $value <= 247) $split = 4; } else $split = 1; $key = NULL; for ( $j = 0; $j < $split; $j++, $i++ ) $key .= $str[$i]; array_push( $array, $key ); } return $array; } function encodestring($st) { // Сначала заменяем "односимвольные" фонемы. $st_cyr = str_split_utf8("абвгґдеёзиійклмнопрстуфхыэ"+ "АБВГҐДЕЁЗИІЙКЛМНОПРСТУФХЫЭ "); $st_lat = str_split_utf8("abvggdeeziyyklmnoprstufhie"+ "ABVGGDEEZIYYKLMNOPRSTUFHIE_"); foreach ($st_lat as $key => $value) { $st_lat[$st_cyr[$key]] = $value; unset($st_lat[$key]); } $st = strtr($st, $st_lat); // Далее заменяем "многосивольные" фонемы, и фонемы без аналогов. $st_mf = array( "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", "щ"=>"shch","ю"=>"yu", "я"=>"ya", "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH", "Щ"=>"SHCH", "Ю"=>"YU", "Я"=>"YA", "ї"=>"yi", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye", "ь"=>"","ъ"=>"","Ь"=>"","Ъ"=>""); $st = strtr($st, $st_mf); // Добиваем синтаксический мусор return ereg_replace("[^A-Za-z0-9\.\–\(\)_]", "", $st); } // пример: echo encodestring("мухаха!@#$%^&*_+!№;%:?*[]{}-=,<>+(ололоЪь)."); // в результате получим: // muhaha_(ololo).