Функция перевода русского текста в транслит используется практически в каждом web-проекте. Например, это применяется для ЧПУ, генерации логина или никнейма по имени пользователя или даже для определения пола по имени! И чаще всего внутри себя представляет что-то типа:
$s = strtr($s, array('а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'e','ж'=>'j','з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'shch','ы'=>'y','э'=>'e','ю'=>'yu','я'=>'ya','ъ'=>'','ь'=>''));
Так вот, никогда так не делайте! Потому что в PHP начиная с версии 5.4 которая вышла в 2012 году уже существует расширение intl, содержащий класс Transliterator и функцию transliterator_transliterate для решения этой задачи.
Транслит русских имён и фамилий при помощи PHP
Сперва нужно установить расширение. Я буду делать это для CentOS:
yum install -y php-intl
Как и принято для старых версий PHP, с модулем intl, в частности с Transliterator можно работать как в ООП-стиле, так и в процедурном. Например, для перевода имён на кириллице в транслит удобнее всего использовать такой код:
$new_name = transliterator_transliterate('Russian-Latin/BGN', $name);
Именно такой вариант наиболее грамотно работает с нюансами русскоязычных имён. Такой код позволит легко получить из имени Юлия — Yulia. Другие опции транслитератора выглядят более коряво, а Ulia уже не выглядит как имя.
Транслитерация с русского на английский в PHP
К сожалению, официальная документация на этот модуль отсутствует. И вместо объяснения нюансов работы можно прочесть только: к настоящему времени эта функция еще не была документирована; для ознакомления доступен только список аргументов. Однако, можно посмотреть стороннюю документацию. Также можно использовать цепочки транслитераций. Например, нельзя напрямую транслитерировать корейский в русский. Однако, можно сначала транслитерировать корейский в латинский алфавит, а затем латиницу в кириллицу. Получается такая цеопчка: 김, 국삼 — Gim, Gugsam — Гим, Гугсам. Работает это примерно так:
$new_name = transliterator_transliterate('Russian/BGN; Title', transliterator_transliterate('Russian-Latin/BGN; Latin; Title', $name));
Также можно в режиме онлайн поиграться с разными опциями транслитерации. Опций реально много и они помогут решить большинство задач по обработке текста:
transliterator_transliterate("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", $name);
Коротко о PHP расширении intl ICU
API расширения максимально соответствует оригинальному API ICU. Благодаря этому документация по ICE может использоваться при работе в PHP.
Расширение интернационализации Intl — это обёртка для библиотеки ICU, позволяющей программистам на PHP производить форматирование, транслитерацию, преобразование кодировок, операции с календарём, сравнение совместимое с UCA, определение границ текста, а также работать с идентификаторами локалей, временными зонами и графемами.