Функция транслитерации русского текста на PHP
Слово "транслитерация" происходит от латинского "transliteratus" ("trans" - "изменение" и "littera" - "буква"). Это метод представления букв одной системы письма либо алфавита буквами другой системы. В быту транслитерация получила широкое распространение для написания SMS в эпоху нерусифицированных сотовых телефонов и для набора текстов на нерусифицированных компьютерах. В Web-строительстве транслитерация обычно используется для создания красивых ЧПУ из заголовков статей и для переименования файлов при их загрузке на сервер.В интернете немало подобных функций на PHP, но они все имеют общий недостаток: преобразования выполняются посимвольно согласно таблице символов замены, при этом заглавные буквы преобразуются без учета их положения в тексте. Для одиночных заглавных букв это не имеет значения, но буквы, транслитерируемые в два и более символа, в этом случае преобразуются с ошибкой. Поясню на примере. Преобразуем в транслит с простой заменой слова "Япония" и "ЮАР", получится "Yaponiya" и "YuAR". Первое слово нормально, а вот аббревиатура исказилась, ведь должно быть "YUAR". Я написал свою функцию транслитерации, которая учитывает местоположение таких составных букв и, в зависимости от этого, преобразует их в последовательность заглавных или только одну заглавную и строчные буквы. Набор символов в таблице транслитерации у меня отличается от ГОСТ 7.79-2000 "Правила транслитерации кирилловского письма латинским алфавитом", если вам потребуется строгое соответствие, то можете доработать функцию самостоятельно.
Code (PHP) : Убрать нумерацию
- //----------------------------------------------------------------------
- // Перевод кириллической строки в транслит и исправление умляутов
- //----------------------------------------------------------------------
- function translit($str, $fix_umlauts=false) {
- // Установить опции и кодировку регулярных выражений
- mb_regex_set_options('pd');
- mb_internal_encoding('UTF-8');
- // Привести строку к UTF-8
- if (strtolower(mb_detect_encoding($str,
- 'utf-8, windows-1251'))=='windows-1251') {
- $str=mb_convert_encoding($str, 'utf-8', 'windows-1251');
- }
- // Регулярки для удобства
- $regexp1='(?=[A-Z0-9А-Я])';
- $regexp2='(?<=[A-Z0-9А-Я])';
- // Массивы для замены заглавных букв, идущих последовательно
- $rus=array(
- '/(Ё'.$regexp1.')|('.$regexp2.'Ё)/u',
- '/(Ж'.$regexp1.')|('.$regexp2.'Ж)/u',
- '/(Ч'.$regexp1.')|('.$regexp2.'Ч)/u',
- '/(Ш'.$regexp1.')|('.$regexp2.'Ш)/u',
- '/(Щ'.$regexp1.')|('.$regexp2.'Щ)/u',
- '/(Ю'.$regexp1.')|('.$regexp2.'Ю)/u',
- '/(Я'.$regexp1.')|('.$regexp2.'Я)/u'
- );
- $eng=array(
- 'YO','ZH','CH','SH','SCH','YU','YA'
- );
- // Заменить заглавные буквы, идущие последовательно
- $str=preg_replace($rus,$eng,$str);
- // Массивы для замены одиночных заглавных и строчных букв
- $rus=array(
- '/а/u','/б/u','/в/u','/г/u','/д/u','/е/u','/ё/u',
- '/ж/u','/з/u','/и/u','/й/u','/к/u','/л/u','/м/u',
- '/н/u','/о/u','/п/u','/р/u','/с/u','/т/u','/у/u',
- '/ф/u','/х/u','/ц/u','/ч/u','/ш/u','/щ/u','/ъ/u',
- '/ы/u','/ь/u','/э/u','/ю/u','/я/u',
- '/А/u','/Б/u','/В/u','/Г/u','/Д/u','/Е/u','/Ё/u',
- '/Ж/u','/З/u','/И/u','/Й/u','/К/u','/Л/u','/М/u',
- '/Н/u','/О/u','/П/u','/Р/u','/С/u','/Т/u','/У/u',
- '/Ф/u','/Х/u','/Ц/u','/Ч/u','/Ш/u','/Щ/u','/Ъ/u',
- '/Ы/u','/Ь/u','/Э/u','/Ю/u','/Я/u'
- );
- $eng=array(
- 'a','b','v','g','d','e','yo',
- 'zh','z','i','y','k','l','m',
- 'n','o','p','r','s','t','u',
- 'f','h','c','ch','sh','sch','',
- 'i','','e','yu','ya',
- 'A','B','V','G','D','E','Yo',
- 'Zh','Z','I','Y','K','L','M',
- 'N','O','P','R','S','T','U',
- 'F','H','C','Ch','Sh','Sch','',
- 'I','','E','Yu','Ya'
- );
- // Заменить оставшиеся заглавные и строчные буквы
- $str=preg_replace($rus,$eng,$str);
- // Исправление умляутов и других надсимвольных значков
- if ($fix_umlauts) {
- $str=preg_replace('/&(.)(tilde|uml);/',"$1",
- mb_convert_encoding($str,'HTML-ENTITIES','utf-8'));
- }
- return $str;
- }
Примеры использования функции (осмысленность текстов не имеет значения, слова подобраны просто для демонстрации):
Code (PHP) : Убрать нумерацию
- echo translit('Я ЛЮБЛЮ Мультфильм "Ёжик в тумане", снятый в Японии');
- // Ya LYUBLYU Multfilm "Yozhik v tumane", snyatiy v Yaponii
- echo translit('Организация ЮНЕСКО на юге Югославии');
- // Organizaciya YUNESKO na yuge Yugoslavii
Просмотров: 7533 | Комментариев: 6
Метки: PHP
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Владимир
(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
Что-то ссылки не выходят нормально.
В общем, вот страница загрузки программы, там оба архива:
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
Поправил пару буковок, перезалил архив с 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
И сделал, но не впечатлило и было отложено надолго.
А совсем недавно общался с парой людей, у которых компьютеры нерусифицированы - так они гонят большие тексты волапюком.
Тут и вспомнилась та досовская утиль - помогло.
А на днях решил забацать WIN-GUI версию, чтобы проще было с интернетом работать.
Вот какая штука получилась:
old-dos.ru/dl.php?id=12985
При обратной транслитерации (с волапюка), конечно, не всё корректно переводится, но текст выходит вполне читаемым.
Более-менее доволен. Но не очень..
----------------------------
)А это архивная досовская утиль с сорсами на паскале (что я изгалялся когда-то):
old-dos.ru/dl.php?id=6702
Валигози
(25.11.2014 в 16:18):
Блог суперский - просто зачитываюсь им.
Огромное спасибо - много интересного для себя нашёл.
Огромное спасибо - много интересного для себя нашёл.
Добавить комментарий
Заполните форму для добавления комментария
У меня есть плагин транслитерации. Написан на 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");
В вашем примере показан схожий пример. Но я не мог внедрить этот код в мой плагин. Как этот способ использовать? Помогите, пожалуйста.