Транслитерация русских букв
Опубликовано пн, 28/12/2015 - 22:40
Задача довольна распространенная. В данной статье рассмотрим возможные варианты транслитерации, а именно: с помощью кастомных функций, контрибного модуля и непосредственно с помощью самого PHP. Основное внимание будет уделено транслитерации русского языка, но будут также присутствовать универсальные способы. Строка, которую будем переводить, пусть будет - "Я люблю Друпал". Первые три функции кастомные, можно сказать своего рода это велосипеды, но тем не менее, вполне работающие в узком кругу задач.
Содержание
- Транслитерация с str_replace()
- Транслитерация с strtr() вариант 1
- Транслитерация с strtr() вариант 2
- Транслитерация с помощью transliteration модуля
- Transliterator класс
Транслитерация с 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 |
Результат транслита немного отличается от предыдущих, но зато данный класс работает стабильнее любого велосипеда.
Дополнительная информация по статье
- http://php.net/manual/en/function.str-replace.php - описание функции str_replace().
- http://php.net/manual/en/function.strtr.php - описание функции strtr().
- https://www.drupal.org/project/transliteration - официальная страница контрибного модуля transliteration.
- http://php.net/manual/en/class.transliterator.php - описание класса Transliterator из официальной документации.