Спонсоры


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

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


Автор:





Serg
Добрый день. Огромное спасибо за статью, но при обратном транслите возникла следующая проблема strtr почему то возвращает false
25-08-2014
EUGEN
Ivan, очень рад, что мои труды кому-то полезны.
31-03-2014
big_eugen@mail.ru
Ivan
Спасибо, благодаря вам сэкономил время =)
31-03-2014
Вверх