Спонсоры


2013
2
Марта

Прямая и обратная транслитерация на PHP

Часто, при написании сайтов на PHP, возникает необходимость траслитерировать некоторые входные данные или, наоборот, сделать из транслита нормальное русское слово. Такая необходимость возникла и у меня.

Собственно сам процесс транслитерации на PHP довольно прост и особых затруднений не вызывает. Трудности и споры возникают в вопросе замены букв. Например: возьём латинскую букву "e". Многие ставят её эквивалентом сразу трём буквам русского алфавита "е", "ё" и "э". При чтении этопроблем не вызывает. Однако, если транслитерировать, например, слово "prochee" некоторым алгоритмом на PHP, то навыходе можем получить один из 3-х вариантов: "прочее", "прочёё", "прочээ". Тоже самое касаетсяи некоторых других букв.

Чтобы избежать подобных проблем, нужно каждой русской букве подобрать идивидуальный эквивалент на латинице. Дабы не изобретать велосипед, предлагаю пользоваться ГОСТом транслитерации.

 

Таблица транслитерации ГОСТ 7.79-2000:

 

 а   a 
 б   b 
 в   v 
 г   g 
 д   d 
 е   e 
 ё   yo 
 ж   zh 
 з   z 
 и   i, i' 
 й   j 
 к   k 
 л   l 
 м   m 
 н   n 
 о   o 
 п   p 
 р   r 
 с   s 
 т   t 
 у   u 
 ф   f 
 х   x 
 ц   cz, c 
 ч   ch 
 ш   sh 
 щ   shh 
 ъ   `` 
 ы   y' 
 ь   ` 
 э   e` 
 ю   yu 
 я   ya 

Ну в теперь, как это выглядит на PHP:


<?php
    $translit = array(
  
            'а' => 'a',   'б' => 'b',   'в' => 'v',
 
            'г' => 'g',   'д' => 'd',   'е' => 'e',
 
            'ё' => 'yo',   'ж' => 'zh',  'з' => 'z',
 
            'и' => 'i',   'й' => 'j',   'к' => 'k',
 
            'л' => 'l',   'м' => 'm',   'н' => 'n',
 
            'о' => 'o',   'п' => 'p',   'р' => 'r',
 
            'с' => 's',   'т' => 't',   'у' => 'u',
 
            'ф' => 'f',   'х' => 'x',   'ц' => 'c',
 
            'ч' => 'ch',  'ш' => 'sh',  'щ' => 'shh',
 
            'ь' => '\'',  'ы' => 'y',   'ъ' => '\'\'',
 
            'э' => 'e\'',   'ю' => 'yu',  'я' => 'ya',
         
 
            'А' => 'A',   'Б' => 'B',   'В' => 'V',
 
            'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
 
            'Ё' => 'YO',   'Ж' => 'Zh',  'З' => 'Z',
 
            'И' => 'I',   'Й' => 'J',   'К' => 'K',
 
            'Л' => 'L',   'М' => 'M',   'Н' => 'N',
 
            'О' => 'O',   'П' => 'P',   'Р' => 'R',
 
            'С' => 'S',   'Т' => 'T',   'У' => 'U',
 
            'Ф' => 'F',   'Х' => 'X',   'Ц' => 'C',
 
            'Ч' => 'CH',  'Ш' => 'SH',  'Щ' => 'SHH',
 
            'Ь' => '\'',  'Ы' => 'Y\'',   'Ъ' => '\'\'',
 
            'Э' => 'E\'',   'Ю' => 'YU',  'Я' => 'YA',
 
        );
 
       $word = strtr('прочее', $translit); // транслитерация. Переменная $word получит значение 'prochee'
       $word = strtr('prochee', array_flip($translit)); // обратная транслитерация. Переменная $word получит значение 'прочее'
?>

Думаю здесь всё понятно, но на всякй случай немного поясню. В массиве $translit содержатся пары ключ-значение (кирилица-латиница). Функция strtr() ищет в слове совпадения с ключами и заменяет их значениями.  Функция array_flip() меняет местами ключи и их значения. Используется для того, чтобы не писать второй массив.

Вот и всё. Пользуйтесь.


Автор:





den_pro8
Всё заработало!!!
12-04-2015
exra@denabachin.url.ph
EUGEN
den_pro8, у тебя не работает из-за пустых кавычек в некоторых буквах (ь, Ь, ъ, Ъ). Если в кавычках что-нибудь напишешь - будет работать. Ибо при использовании array_flip() значения становятся ключами массива. А пустым ключ быть не может.
11-04-2015
big_eugen@mail.ru
den_pro8
function ftranslite2($name2){

 $name2=preg_replace("/[\s+\.\,]/","-",$name2);
 $name2=preg_replace("/[\"\'\!\?\(\)\:\$\%]/","",$name2); 

 static $trans2= array(
 'а'=>'a', 'б'=>'b', 'в'=>'v', 'г'=>'g', 
 'д'=>'d', 'е'=>'e', 'ж'=>'zh', 'з'=>'z',
 'и'=>'i', 'й'=>'y', 'к'=>'k', 'л'=>'l', 
 'м'=>'m', 'н'=>'n', 'о'=>'o', 'п'=>'p',
 'р'=>'r', 'с'=>'s', 'т'=>'t', 'у'=>'u', 
 'ф'=>'f', 'ы'=>'i', 'э'=>'yoe', 'А'=>'A',
 'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 
 'Е'=>'E', 'Ж'=>'ZH', 'З'=>'Z', 'И'=>'I',
 'Й'=>'Y', 'К'=>'K', 'Л'=>'L', 'М'=>'M', 
 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R',
 'С'=>'S', 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 
 'Ы'=>'I', 'Э'=>'YOE', 'ё'=>"yo", 'х'=>"h",
 'ц'=>"c", 'ч'=>"ch", 'ш'=>"sh", 'щ'=>"shch", 
 'ъ'=>"", 'ь'=>"", 'ю'=>"yu", 'я'=>"ya",
 'Ё'=>"YO", 'Х'=>"H", 'Ц'=>"C", 'Ч'=>"CH", 
 'Ш'=>"SH", 'Щ'=>"SHCH", 'Ъ'=>"", 'Ь'=>"",
 'Ю'=>"YU", 'Я'=>"YA"
 );
 
 $strstring2 = strtr($name2, array_flip($trans2)) ;
 
 return strtolower($strstring2) ;
 }
array_flip Без этой функции, функция ftranslite2 работает как обычно а подключаю array_flip вообще не чего не выводиться
10-04-2015
exra@denabachin.url.ph
den_pro8
extract($HTTP_GET_VARS); 
extract($HTTP_POST_VARS);
function latrus ($string) # Теперь задаём функцию перекодировки транслита в кириллицу.
{
$string = ereg_replace("zh","ж",$string);
$string = ereg_replace("Zh","Ж",$string);
$string = ereg_replace("yo","ё",$string);
$string = ereg_replace("Yu","Ю",$string);
$string = ereg_replace("Ju","Ю",$string);
$string = ereg_replace("ju","ю",$string);
$string = ereg_replace("yu","ю",$string);
$string = ereg_replace("sh","ш",$string);
$string = ereg_replace("yoe","э",$string);
$string = ereg_replace("ja","я",$string);
$string = ereg_replace("ya","я",$string);
$string = ereg_replace("Sh","Ш",$string);
$string = ereg_replace("Ch","Ч",$string);
$string = ereg_replace("ch","ч",$string);
$string = ereg_replace("Yo","Ё",$string);
$string = ereg_replace("Ya","Я",$string);
$string = ereg_replace("Ja","Я",$string);
$string = ereg_replace("YOE","Э",$string);
$string = ereg_replace("i","и",$string);
$string = ereg_replace("-","ь",$string);
$string = ereg_replace("c","ц",$string);
$string = ereg_replace("u","у",$string);
$string = ereg_replace("k","к",$string);
$string = ereg_replace("e","е",$string);
$string = ereg_replace("n","н",$string);
$string = ereg_replace("g","г",$string);
$string = ereg_replace("z","з",$string);
$string = ereg_replace("h","х",$string);
$string = ereg_replace("''","ъ",$string);
$string = ereg_replace("f","ф",$string);
$string = ereg_replace("y","ы",$string);
$string = ereg_replace("v","в",$string);
$string = ereg_replace("a","а",$string);
$string = ereg_replace("p","п",$string);
$string = ereg_replace("r","p",$string);
$string = ereg_replace("o","о",$string);
$string = ereg_replace("l","л",$string);
$string = ereg_replace("d","д",$string);
$string = ereg_replace("s","с",$string);
$string = ereg_replace("m","м",$string);
$string = ereg_replace("t","т",$string);
$string = ereg_replace("b","б",$string);
$string = ereg_replace("I","Й",$string);
$string = ereg_replace("'","Ь",$string);
$string = ereg_replace("C","Ц",$string);
$string = ereg_replace("U","У",$string);
$string = ereg_replace("K","К",$string);
$string = ereg_replace("E","Е",$string);
$string = ereg_replace("N","Н",$string);
$string = ereg_replace("G","Г",$string);
$string = ereg_replace("Z","З",$string);
$string = ereg_replace("H","Х",$string);
$string = ereg_replace("''","Ъ",$string);
$string = ereg_replace("F","Ф",$string);
$string = ereg_replace("Y","Ы",$string);
$string = ereg_replace("V","В",$string);
$string = ereg_replace("A","А",$string);
$string = ereg_replace("P","П",$string);
$string = ereg_replace("R","Р",$string);
$string = ereg_replace("O","О",$string);
$string = ereg_replace("L","Л",$string);
$string = ereg_replace("D","Д",$string);
$string = ereg_replace("S","С",$string);
$string = ereg_replace("M","М",$string);
$string = ereg_replace("I","И",$string);
$string = ereg_replace("T","Т",$string);
$string = ereg_replace("B","Б",$string);
$string = ereg_replace("_"," ",$string);
return $string;
} 
но этот способ на более новых версиях php не работает
10-04-2015
exra@denabachin.url.ph
den_pro, не знаю почему у тебя не работает. Я перепроверил. Добавил исчезнувшие обратные слеши перед кавычками и всё заработало в обе стороны. Ну а если нашёл другой способ, то поделись с массами. Может твой способ лучше.
31-03-2015
big_eugen@mail.ru
Вверх