12 марта 2009, 5:08

Конвертация кириличной строки (Cyrillic UTF8) в транслит Избранное

Это обновлённый вариант
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).  

3 комментария РСС

Андрей
не работает, вообще
$st = strtr($st, $st_lat) — выдает пустой результат
Vitaliy Bogdanets
Проблема только на новых пхп, уже просто использую новый метод, наверное добавлю его позже, сюда :)
Андрей
статья от 12 марта 2009, не думаю что появилось много новых пхп :)

кстати, стоит также указывать в какой кодировке сохранять скрипт (utf-8, ascii... etc) в случае когда кирилица хранится в текстовом виде в массивах

лично я, тоже использую другой метод, который пришлось написать самому. очень простой к тому же, в котором используются multibyte safe функции
Vitaliy Bogdanets
Использовал этот метод на хостинге с полгода, хостер обновил пхп и он перестал работать (5.1.2 на 5.2.9). Почему, я не знаю ;) не вникал

Новый метод сча приложу ;)
xmoonlight
Ошибка, если первая буква — Р (русская)
$string = preg_replace(«/[_\s\.,?!\[\](){}]+/», «_», $string);
поправьте на:
$string = preg_replace(«/[_ \.,?!\[\](){}]+/», «_», $string);

Замените \s на обычный пробел.

Ваш комментарий

адрес не будет опубликован

ХТМЛ не работает


Ctrl + Enter