функция транслит в php
PHP функция перевода в транслит transliterator_transliterate()
Функция перевода русского текста в транслит используется практически в каждом web-проекте. Например, это применяется для ЧПУ, генерации логина или никнейма по имени пользователя или даже для определения пола по имени! И чаще всего внутри себя представляет что-то типа:
Так вот, никогда так не делайте! Потому что в PHP начиная с версии 5.4 которая вышла в 2012 году уже существует расширение intl, содержащий класс Transliterator и функцию transliterator_transliterate для решения этой задачи.
Транслит русских имён и фамилий при помощи PHP
Сперва нужно установить расширение. Я буду делать это для CentOS:
Как и принято для старых версий PHP, с модулем intl, в частности с Transliterator можно работать как в ООП-стиле, так и в процедурном. Например, для перевода имён на кириллице в транслит удобнее всего использовать такой код:
Именно такой вариант наиболее грамотно работает с нюансами русскоязычных имён. Такой код позволит легко получить из имени Юлия — Yulia. Другие опции транслитератора выглядят более коряво, а Ulia уже не выглядит как имя.
Транслитерация с русского на английский в PHP
К сожалению, официальная документация на этот модуль отсутствует. И вместо объяснения нюансов работы можно прочесть только: к настоящему времени эта функция еще не была документирована; для ознакомления доступен только список аргументов. Однако, можно посмотреть стороннюю документацию. Также можно использовать цепочки транслитераций. Например, нельзя напрямую транслитерировать корейский в русский. Однако, можно сначала транслитерировать корейский в латинский алфавит, а затем латиницу в кириллицу. Получается такая цеопчка: 김, 국삼 — Gim, Gugsam — Гим, Гугсам. Работает это примерно так:
Также можно в режиме онлайн поиграться с разными опциями транслитерации. Опций реально много и они помогут решить большинство задач по обработке текста:
Коротко о PHP расширении intl ICU
API расширения максимально соответствует оригинальному API ICU. Благодаря этому документация по ICE может использоваться при работе в PHP.
Расширение интернационализации Intl — это обёртка для библиотеки ICU, позволяющей программистам на PHP производить форматирование, транслитерацию, преобразование кодировок, операции с календарём, сравнение совместимое с UCA, определение границ текста, а также работать с идентификаторами локалей, временными зонами и графемами.
Читайте также
Стандартные библиотеки PHP умеют генерировать только целые случайные числа. Однако, возникают задачи где нужно не целое рандомное число с максимально…
Иногда при обработке с помощью PHP больших и не очень данных, можно словить досадную ошибку посреди выполнения скрипта: PHP Fatal…
PHP: Функция транслита
Хочу поделиться кое какими своими наработками, в частности функцией траслита на PHP. На входе кириллица, а на выходе предложение на латинской раскладке. Собственно для чего она может пригодиться? Например для генерации ЧПУ на своем сайте, из заголовка новости. Особенно эта функция может пригодиться сторонникам самописных CMS.
Впрочем одним ЧПУ можно не ограничиваться, а пойти гораздо дальше. И конвертировать например, все ники пользователей на сайте, написанные на русском. Да, вы не поверите, но именно с такими просьбами ко мне обращаются «админы» периодически.
Не буду утомлять своими рассуждениями. Представляю вам функцию generate_chpu;
Полезная и не заменимая фишка для поискового SEO, вашего сайта. Думая с установкой и подключением разберетесь самостоятельно. (Хотя блог в большинстве читают новички)
Похожие записи
3 комментария to “PHP: Функция транслита”
Спасибо, а он будет слеши убирать? И есть ли какие-нибудь подводные камни? С кодировкой может проблемы или еще что? Я себе сделал, пока проблем нет.
Да слеши убирает, проблем с кодировкой быть не должно.
в converter’e большие буквы не сильно и помогут, всё равно всё в нижний регистр переводится.
а так реализация понравилась, у меня чуть по-другому было. этот вариант лучше, хоть и оставляет в результате возможность повторение — и _ много раз подряд
(если —— было в основной строке).
Оставить комментарий
Друзья, всем привет!
Меня зовут Роман Чернышов, я веб-разработчик и данный блог посвящен моим проектам и бизнесу.
Тут я делюсь личным опытом
и отвечаю на вопросы. Я всегда готов к сотрудничеству с вами, готов реализовать проект любой сложности( опыт 10+ лет ).
PHP функция перевода в транслит translit()
Достаточно сложно сказать, какой вариант ЧПУ наиболее оптимален для поисковых систем и насколько это влияет на релевантность. В рамках данной статьи я решил опустить данный вопрос и предложить вашему вниманию готовую php-функцию перевода кириллицы (русского) в транслит, которую я использую в своих проектах.
Нюансы перевода в транслит
PHP-функция translit()
Всё выше сказанное, по крайней мере, в упрощенном виде, реализовано в используемой мной функции перевода в транслит, вот её php-код:
Как Вы видите, я постарался дать комментарии ко всем осуществляемым здесь действиям. При желании Вы можете отказаться от чего-то из предложенного, дополнить или изменить существующие. В любом случае данная php-функция перевода в транслит, как по мне, наиболее оптимальна.
Коротко о транслитерации
Процесс транслитерации имеет массу особенностей. В своей статье я остановился именно на переводе кириллицы в транслит, т.е. русский текст набранный латинскими буквами. Предложенный вариант php-функции, заточен под создание ЧПУ, которое нормально воспринимается поисковыми системами Google и Яндекс. В принципе, translit() я использую как одну из функций набора фильтров, что позволяет автоматизировать сам процесс обработки данных, но это совсем другая история.
Ну, и т.к. мы заговорили о ЧПУ, следует также сказать и о полноценном переводе. Очевидно, что реализация такого варианта собственными силами не будет простой, а значит более правильно будет воспользоваться сторонним сервисом, например, Google переводчиком. Если данная тема Вам интересна, рекомендую ознакомиться с моей PHP-функцией многоязычного перевода gtranslate().
На этом у меня всё. Спасибо за внимание. Удачи!
По-моему это очень недоработанная транслитерация, применять где-то на практике ее будет сложно. Слово «объектив» у вас будет «obektiv», без указания смягчения буквы «б». Нормальные транслитераторы делают «ob’ektiv» или «objektiv»
2 декабря 2013 г., 11:25 Удалить комментарий
@plutov.by: приведенный пример транслитерации заточен под ЧПУ, а в нём символ одинарной кавычки не допустим, а точнее вызовет дополнительные проблемы.
2 декабря 2013 г., 11:29 Удалить комментарий
Тогда беру свои слова обратно, пропустил ЧПУ, это всё понедельник 🙂
2 декабря 2013 г., 11:31 Удалить комментарий
@plutov.by: не, в принципе, логично, но невозможно учесть все варианты, а транслит обычно используют именно под ЧПУ. 🙂
2 декабря 2013 г., 11:43 Удалить комментарий
так как после удаления недопустимых символов возникают двойные, тройные и т.д. пробелы
а в целом хорошая функция получилась, вычищает разный мусор и делает всё красиво! 😉
24 января 2015 г., 0:48 Удалить комментарий
Спасибо большое. часть вашего кода мне очень помогла.
28 октября 2015 г., 12:18 Удалить комментарий
12 ноября 2015 г., 17:07 Удалить комментарий
2Олег так функция возвращает значение, т. е. его можно присвоить переменной:
$result = translit(‘функция перевода в транслит’);
или вывести на экран:
echo translit(‘функция перевода в транслит’);
12 ноября 2015 г., 17:09 Удалить комментарий
Спасибо за подсказку
14 ноября 2015 г., 17:03 Удалить комментарий
Чтобы не задавать локаль для strtolower($s), можно добавить соответствия для заглавных букв в array() и потом уже переводить в нижний регистрр
28 февраля 2016 г., 18:58 Удалить комментарий
2Алексей Можно, но это значительно увеличит размер массива.
1 марта 2016 г., 11:41 Удалить комментарий
Спасибо. Сэкономил ку-у-у-учу времени. Просто copy&paste и все работает!
18 сентября 2016 г., 3:25 Удалить комментарий
А могу я эту функцию вставить в обработчик формы, чтобы он в строку дополнительную загонял транслитом?
23 октября 2016 г., 21:19 Удалить комментарий
Я так делал для своих CMSок, что ЧПУ генерить.
23 октября 2016 г., 23:01 Удалить комментарий
Спасибо Автор 🙂 работает все оху. о)
11 декабря 2016 г., 16:57 Удалить комментарий
Я бы еще добавил ‘UTF-8’ в строку mb_strtolower($s, ‘UTF-8’) : strtolower($s, ‘UTF-8’);
23 февраля 2017 г., 15:55 Удалить комментарий
3 марта 2017 г., 18:37 Удалить комментарий
Спасибо. Отличная функция. Ооочень помогла!
24 марта 2017 г., 14:52 Удалить комментарий
12 апреля 2017 г., 20:34 Удалить комментарий
Благослови Вас бог. Я чуть не потратил кучу времени.
Русский текст в транслит на PHP
Например, если имя «Михаил«, то логин должен быть «mihail«. Если такой логин уже занят, то тогда логин «mihail1«, если и он уже занят, то «mihail2» и так далее до свободного. Теперь, собственно, возвращаемся к теме статьи. Вот простейшая функция, которая переводит русский текст в транслит:
Думаю, что здесь код очень прозрачный: есть 2 массива с одинаковым числом элементов. В первом массиве буквы русского алфавита, а во втором в соответствующих позициях их написание в транслите. Затем идёт обычная замена с помощью функции str_replace() и возврат результата.
Вот таким образом делается перевод русского текста в транслит на PHP.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 6 ):
Еще есть такая полезная функция как strtr
Смысле, Вы хотите, чтобы полученные данные были переведены в транслит?
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Transliterator::transliterate
(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)
Описание
Преобразует строку или её часть, используя транслитератор ICU.
Список параметров
Строка для транслитерации.
Начальный индекс, включительно, (в кодовых единицах UTF-16), с которого начинается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст до этой позиции останется как есть.
Начальный индекс, не включая, (в кодовых единицах UTF-16), которым заканчивается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст с этой позиции останется как есть.
Возвращаемые значения
Преобразованная строка в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Конвертация экранированной UTF-16 строки
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
User Contributed Notes 5 notes
Sorry, for posting it again, but I found a bug in my code:
Here’s my new code, including an example:
var_dump(transliterator_transliterate(‘Any-Latin; Latin-ASCII; [\u0100-\u7fff] remove’,
«A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi»));
// string(50) «A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi»
Also an example here:
var_dump(iconv(«UTF-8», «ASCII//TRANSLIT//IGNORE», transliterator_transliterate(‘Any-Latin; Latin-ASCII’,
«A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi»));
// string(50) «A ae Ubermensch pa hoyeste niva! I a lublu PHP! est’. fi»
You can create slugs easily with:
echo slugify ( «Я люблю PHP!» );
?>
There are some possibly undesirable conversions with ASCII//TRANSLIT//IGNORE or your users may require some custom stuff.
You might want to run a substitution up front for certain things, such as when you want 3 letter ISO codes to replace currency symbols. £ transliterates to «lb», for example, which is incorrect since it’s a currency symbol, not a weight symbol (#).
ASCII//TRANSLIT//IGNORE does a great job within the realm of possibility 🙂
When it doesn’t do something you want it to, you can set up a CSV with one replacement per line and run a function like:
or you can write some regexes. Transliterating using ASCII//TRANSLIT//IGNORE works so well that your map probably won’t be very long.
= ‘àáâãäçèéêëìíîïñòóôõöùúûüýÿ
ÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ’ ;
$rule = ‘NFD; [:Nonspacing Mark:] Remove; NFC’ ;