Blog. Just Blog

Функция транслитерации русского текста на PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Слово "транслитерация" происходит от латинского "transliteratus" ("trans" - "изменение" и "littera" - "буква"). Это метод представления букв одной системы письма либо алфавита буквами другой системы. В быту транслитерация получила широкое распространение для написания SMS в эпоху нерусифицированных сотовых телефонов и для набора текстов на нерусифицированных компьютерах. В Web-строительстве транслитерация обычно используется для создания красивых ЧПУ из заголовков статей и для переименования файлов при их загрузке на сервер.

В интернете немало подобных функций на PHP, но они все имеют общий недостаток: преобразования выполняются посимвольно согласно таблице символов замены, при этом заглавные буквы преобразуются без учета их положения в тексте. Для одиночных заглавных букв это не имеет значения, но буквы, транслитерируемые в два и более символа, в этом случае преобразуются с ошибкой. Поясню на примере. Преобразуем в транслит с простой заменой слова "Япония" и "ЮАР", получится "Yaponiya" и "YuAR". Первое слово нормально, а вот аббревиатура исказилась, ведь должно быть "YUAR". Я написал свою функцию транслитерации, которая учитывает местоположение таких составных букв и, в зависимости от этого, преобразует их в последовательность заглавных или только одну заглавную и строчные буквы. Набор символов в таблице транслитерации у меня отличается от ГОСТ 7.79-2000 "Правила транслитерации кирилловского письма латинским алфавитом", если вам потребуется строгое соответствие, то можете доработать функцию самостоятельно.
  1. //----------------------------------------------------------------------
  2. // Перевод кириллической строки в транслит и исправление умляутов
  3. //----------------------------------------------------------------------
  4. function translit($str$fix_umlauts=false) {
  5.     // Установить опции и кодировку регулярных выражений
  6.     mb_regex_set_options('pd');
  7.     mb_internal_encoding('UTF-8');
  8.  
  9.     // Привести строку к UTF-8
  10.     if (strtolower(mb_detect_encoding($str,
  11.         'utf-8, windows-1251'))=='windows-1251') {
  12.         $str=mb_convert_encoding($str'utf-8''windows-1251');
  13.     }
  14.  
  15.     // Регулярки для удобства
  16.     $regexp1='(?=[A-Z0-9А-Я])';
  17.     $regexp2='(?<=[A-Z0-9А-Я])';
  18.  
  19.     // Массивы для замены заглавных букв, идущих последовательно
  20.     $rus=array(
  21.         '/(Ё'.$regexp1.')|('.$regexp2.'Ё)/u',
  22.         '/(Ж'.$regexp1.')|('.$regexp2.'Ж)/u',
  23.         '/(Ч'.$regexp1.')|('.$regexp2.'Ч)/u',
  24.         '/(Ш'.$regexp1.')|('.$regexp2.'Ш)/u',
  25.         '/(Щ'.$regexp1.')|('.$regexp2.'Щ)/u',
  26.         '/(Ю'.$regexp1.')|('.$regexp2.'Ю)/u',
  27.         '/(Я'.$regexp1.')|('.$regexp2.'Я)/u'
  28.     );
  29.  
  30.     $eng=array(
  31.         'YO','ZH','CH','SH','SCH','YU','YA'
  32.     );
  33.  
  34.     // Заменить заглавные буквы, идущие последовательно
  35.     $str=preg_replace($rus,$eng,$str);
  36.  
  37.     // Массивы для замены одиночных заглавных и строчных букв
  38.     $rus=array(
  39.         '/а/u','/б/u','/в/u','/г/u','/д/u','/е/u','/ё/u',
  40.         '/ж/u','/з/u','/и/u','/й/u','/к/u','/л/u','/м/u',
  41.         '/н/u','/о/u','/п/u','/р/u','/с/u','/т/u','/у/u',
  42.         '/ф/u','/х/u','/ц/u','/ч/u','/ш/u','/щ/u','/ъ/u',
  43.         '/ы/u','/ь/u','/э/u','/ю/u','/я/u',
  44.  
  45.         '/А/u','/Б/u','/В/u','/Г/u','/Д/u','/Е/u','/Ё/u',
  46.         '/Ж/u','/З/u','/И/u','/Й/u','/К/u','/Л/u','/М/u',
  47.         '/Н/u','/О/u','/П/u','/Р/u','/С/u','/Т/u','/У/u',
  48.         '/Ф/u','/Х/u','/Ц/u','/Ч/u','/Ш/u','/Щ/u','/Ъ/u',
  49.         '/Ы/u','/Ь/u','/Э/u','/Ю/u','/Я/u'
  50.     );
  51.  
  52.     $eng=array(
  53.         'a','b','v','g','d','e','yo',
  54.         'zh','z','i','y','k','l','m',
  55.         'n','o','p','r','s','t','u',
  56.         'f','h','c','ch','sh','sch','',
  57.         'i','','e','yu','ya',
  58.  
  59.         'A','B','V','G','D','E','Yo',
  60.         'Zh','Z','I','Y','K','L','M',
  61.         'N','O','P','R','S','T','U',
  62.         'F','H','C','Ch','Sh','Sch','',
  63.         'I','','E','Yu','Ya'
  64.     );
  65.  
  66.     // Заменить оставшиеся заглавные и строчные буквы
  67.     $str=preg_replace($rus,$eng,$str);
  68.  
  69.     // Исправление умляутов и других надсимвольных значков
  70.     if ($fix_umlauts) {
  71.         $str=preg_replace('/&(.)(tilde|uml);/',"$1",
  72.              mb_convert_encoding($str,'HTML-ENTITIES','utf-8'));
  73.     }
  74.  
  75.     return $str;
  76. }
Кроме транслитерации функция исправляет в строке тильды и умляуты, оставляя базовые латинские буквы. На входе первый параметр $str - кириллическая строка в кодировке UTF-8, которую надо транслитерировать. Второй параметр - флаг $fix_umlauts - требуется или нет исправлять умляуты и прочие надстрочные модификаторы символов, по умолчанию значение false. На выходе - преобразованная строка.

Примеры использования функции (осмысленность текстов не имеет значения, слова подобраны просто для демонстрации):
  1. echo translit('Я ЛЮБЛЮ Мультфильм "Ёжик в тумане", снятый в Японии');
  2. // Ya LYUBLYU Multfilm "Yozhik v tumane", snyatiy v Yaponii
  3.  
  4. echo translit('Организация ЮНЕСКО на юге Югославии');
  5. // Organizaciya YUNESKO na yuge Yugoslavii
Как видите, строчные и заглавные буквы, в том числе в "капсе" и аббревиатуре, преобразованы синтаксически корректно. Ошибки могут возникнуть только в неоднозначных случаях с отдельно стоящей заглавной буквой. Например, фраза "Я ЛЮБЛЮ тебя!" равновероятно может быть преобразована в транслит как в "Ya LYUBLYU tebya!", так и в "YA LYUBLYU tebya!", потому что невозможно угадать, какой "регистр" буквы "Я" имел в виду автор изначально.

Поделиться ссылкой ВКонтакте
Просмотров: 7347 | Комментариев: 6

Метки: PHP
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
yuklov (03.03.2019 в 17:33):
Здравствуйте!
У меня есть плагин транслитерации. Написан на php. Он транслитерируют контент (страницу вордпресс) на латиницу.

Пример:
Код (Text):

<?php

class Translit_Core
{

   private static $replace = array(
'ЎЪ'=>'O‘',
'ўъ'=>'o‘',
'“Е'=>'“Ye',
'ЬЕ'=>'YE',
'ье'=>'ye',
'Ь'=>'',
'ь'=>'',
'ЕЛ'=>'YЕL',
'ЁШ'=>'YOSH',
'ЙШ'=>'YSH',
'ЦШ'=>'SSH',
'УШ'=>'USH',
'КШ'=>'KSH',
'ЕШ'=>'ESH',
'НШ'=>'NSH',
...
...
...,

  );

  public static function cir_to_lat($text)
   {
     return strtr($text,self::$replace);
   }

}

*****************************


Я создал правила каждой прописной букве. Это можно сделать кратко в текущем примере по регулярному выражению?
Например, если после или перед буквой Ё есть прописная буква, она должна транслитерироваться как YO. В остальных случаях, как Yo.

Это есть в .js:
Код (Text):

var text = text.replace(/([A-Z])Ё|Ё([A-Z])/g, "$1YO$2");
var text = text.replace(/Ё([a-z])|Ё(\s+)|Ё/g, "Yo$1$2");

В вашем примере показан схожий пример. Но я не мог внедрить этот код в мой плагин. Как этот способ использовать? Помогите, пожалуйста.
Владимир (05.06.2016 в 08:15):
Огромное спасибо! Я использовал ваш код для траслита урлов. Только добавил замену пробела на тире ('/ /u' на '-').
user (28.12.2015 в 01:50):
--Добавлено2--
Что-то ссылки не выходят нормально.
В общем, вот страница загрузки программы, там оба архива:
old-dos.ru/index.php?page=files&mode=files&do=show&id=3221
user (28.12.2015 в 01:28):
--Добавлено--
Поправил пару буковок, перезалил архив с Cyr32voL.exe:
old-dos.ru/dl.php?id=12988
user (27.12.2015 в 20:06):
..когда-то задался целью сделать транслитератор в обе стороны, ради забавы.
И сделал, но не впечатлило и было отложено надолго.
А совсем недавно общался с парой людей, у которых компьютеры нерусифицированы - так они гонят большие тексты волапюком.
Тут и вспомнилась та досовская утиль - помогло.
А на днях решил забацать WIN-GUI версию, чтобы проще было с интернетом работать.
Вот какая штука получилась:
old-dos.ru/dl.php?id=12985

При обратной транслитерации (с волапюка), конечно, не всё корректно переводится, но текст выходит вполне читаемым.

Более-менее доволен. Но не очень..

----------------------------
)А это архивная досовская утиль с сорсами на паскале (что я изгалялся когда-то):
old-dos.ru/dl.php?id=6702
Валигози (25.11.2014 в 16:18):
Блог суперский - просто зачитываюсь им.
Огромное спасибо - много интересного для себя нашёл.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0065 сек.) / Память: 4.5 Mb
Наверх