Спонсоры


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() меняет местами ключи и их значения. Используется для того, чтобы не писать второй массив.

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


Автор:





Yuklov
У меня есть вордпресс плагин-транслитератор, который работает с функцией $replace = array и return strtr($text,self::$replace). Не могу добавлят эти функции: 1. Как делать чтобы в начале слова (или строки) букву «Е» транслитерировать как «Ye», в остальных случаях «E»? 2. Если все буквы слова вверхном регистре, Ш должен транслитерировать как SH, а не Sh. Если кто-нибудь знает, помогите пожалуйста.
01-11-2017
yuklash@yandex.ru
Спасибо все работает! :) обратный транслит иностранных имен проходит на ура...
28-06-2015
Alihold, да собственно так же: $word = strtr('prochee', array_flip($translit)); Только таблицы нужно изменить, что бы правильно передать английское произношение. А если не брать в расчёт произношение, то можно и так оставить.
21-06-2015
big_eugen@mail.ru
Может подскажите как осуществить транскрипцию английских слов русскими буквами?
21-06-2015
EUGEN
Рад помочь.
12-04-2015
big_eugen@mail.ru
Вверх