Спонсоры


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_pro
Обратная транслитерация не работает а обычная работает ну я нашёл другой способ
30-03-2015
exra@denabachin.url.ph
EUGEN
den_pro, что именно не работает? Какие ошибки показывает?
28-03-2015
big_eugen@mail.ru
den_pro
Не работает обратный транслит
27-03-2015
exra@denabachin.url.ph
Ivan
Спасибо БОЛЬШОЕ за статью! 5+
10-09-2014
EUGEN
Serg, извините за задержку. Если Вам всё ещё нужна помощь, то напишите свой код и транслитерируемое слово. Я постараюсь Вам помочь. Можете связаться со мной по e-mail. Он написан под моим сообщением.
27-08-2014
big_eugen@mail.ru
Вверх