Транслитерация русских букв

Транслитерация русских букв

Задача довольна распространенная. В данной статье рассмотрим возможные варианты транслитерации, а именно: с помощью кастомных функций, контрибного модуля и непосредственно с помощью самого PHP. Основное внимание будет уделено транслитерации русского языка, но будут также присутствовать универсальные способы. Строка, которую будем переводить, пусть будет - "Я люблю Друпал". Первые три функции кастомные, можно сказать своего рода это велосипеды, но тем не менее, вполне работающие в узком кругу задач.

Содержание

Транслитерация с str_replace()

Код данной функции довольно прост и основан на замене русских букв на соответствующие англоязычные буквы и их сочетания.

1
2
3
4
5
function MYMODULE_transliterate($str) {
  $ru = 'а,б,в,г,д,е,ё,ж,з,и,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ь,ы,ъ,э,ю,я,А,Б,В,Г,Д,Е,Ё,Ж,З,И,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ь,Ы,Ъ,Э,Ю,Я';
  $en = 'a,b,v,g,d,e,e,zh,z,i,k,l,m,n,o,p,r,s,t,u,f,h,c,ch,sh,shch,,y,,e,yu,ya,A,B,V,G,D,E,E,ZH,Z,I,K,L,M,N,O,P,R,S,T,U,F,H,C,Ch,Sh,Shch,,Y,,E,Yu,Ya';
  return str_replace(explode(',', $ru), explode(',', $en), $str);
}

Результат вызова

1
Ya lyublyu Drupal

Транслитерация с strtr() вариант 1

Данный подход отличается лишь способом замены искомых букв на нужные.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function MYMODULE_transliterate($str) {
  $replace = array(
    'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e',
    'ё' => 'e', 'ж' => 'zh','з' => 'z', 'и' => 'i', 'й' => 'i', 'к' => 'k',
    'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r',
    'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
    'ч' => 'ch','ь' => '',  'ы' => 'y', 'ъ' => '',  'ш' => 'sh','щ' => 'shch',
    'э' => 'e', 'ю' => 'yu','я' => 'ya','А' => 'A', 'Б' => 'B', 'В' => 'V',
    'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh','З' => 'Z',
    'И' => 'I', 'Й' => 'I', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N',
    'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U',
    'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch','Ш' => 'Sh','Щ' => 'Shch',
    'Ь' => '',  'Ы' => 'Y', 'Ъ' => '',  'Э' => 'E', 'Ю' => 'Yu','Я' => 'Ya',
  );
 
  return strtr($str, $replace);

Результирующая строка абсолютно идентична первому примеру.

Транслитерация с strtr() вариант 2

Этот пример аналогичен предыдущему, за исключением того, что здесь определены два массива - один для русских букв, второй - для английских синонимов. При финальной замене собираем общий массив, у которого в качестве ключей выступают искомые буквы, в качестве значений - буквы замены.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function MYMODULE_transliterate($str) {
  $ru = array(
    'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'к', 'л', 'м', 'н', 'о', 'п',
    'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ', 'э', 'ю', 'я',
    'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'К', 'Л', 'М', 'Н', 'О', 'П',
    'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ', 'Э', 'Ю', 'Я',
  );
  $en = array(
    'a', 'b', 'v', 'g', 'd', 'e', 'e', 'zh', 'z', 'i', 'k', 'l', 'm', 'n', 'o', 'p',
    'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'shch', '', 'y', '', 'e', 'yu', 'ya',
    'A', 'B', 'V', 'G', 'D', 'E', 'E', 'ZH', 'Z', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R',
    'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Shch', '', 'Y', '', 'E', 'Yu', 'Ya',
  );
  return strtr($str, array_combine($ru, $en));
}

В этом же примере можно использовать функцию str_replace()[1] вместо strtr()[2]. Итог работы функции

1
Ya lyublyu Drupal

Перевод с помощью transliteration модуля

Для тех, кто не любит изобретать велосипеды можно воспользоваться модулем transliteration[3]. Для транслита используем функцию transliteration_get(). Для этого, сначала проверяем существование модуля, а потом вызываем функцию.

1
2
3
if (module_exists('transliteration') && is_callable('transliteration_get')) {
  echo transliteration_get('Я люблю Друпал');
}

Transliterator класс

Класс Transliterator[4] входит в пакет интернационализации intl. Сам пакет intl доступен с версии PHP 5.3.0, но Transliterator только с PHP >= 5.4.0, PECL intl >= 2.0.0.
Установка пакета интернационализации в ubuntu.

1
sudo apt-get install php5-intl

Затем нужно перезапустить веб-сервер (у меня это apache).

1
sudo service apache2 restart

Ниже приведен пример использования транслитератора

1
2
3
function MYMODULE_transliterate($str) {
  echo transliterator_transliterate('Any-Latin; Latin-ASCII;', $str);
}

В итоге получаем.

1
A lublu Drupal

Результат транслита немного отличается от предыдущих, но зато данный класс работает стабильнее любого велосипеда.

Дополнительная информация по статье

  1. http://php.net/manual/en/function.str-replace.php - описание функции str_replace().
  2. http://php.net/manual/en/function.strtr.php - описание функции strtr().
  3. https://www.drupal.org/project/transliteration - официальная страница контрибного модуля transliteration.
  4. http://php.net/manual/en/class.transliterator.php - описание класса Transliterator из официальной документации.