Может ли одна идея изменить мир?

Функция для транслитерации url на php

Функция для транслитерации url на php

При создании сайтов и в веб-программировании транслитерация применяется чуть ли не в каждом сайте. Любой url-адрес или файл на сервере для удобства доступа к нему, как правило, записывается латинскими буквами. Поэтому применяется транслитерация для преобразования слов на других языках в аналогичные последовательности латинских букв. В частности, транслитерация применяется для преобразования кириллических букв в транслит.

Вариантов транслитерации кириллических букв русского алфавита в латинские может быть достаточно много. Есть к примеру ГОСТы и стандарты ISO, условно принятые для преобразования одних символов в другие. Однако не все они подходят в том или ином случае. Например, в качестве символов url-адреса лучше использовать только большие и маленькие буквы от A до Z, цифры от 0 до 9 и знаки - и _. А знаки, типа кавычек, аппострафов, пробелов, табуляций, восклицательных и вопросительных знаков и пр. символов, могут служить определёнными разделителями или вовсе не допускаются в url-адресе.

С другой стороны в русском алфавите используется 33 буквы, а в английском всего лишь 26, и поэтому закодировать все русские буквы одной латинской буквой не получится. Для этого следует использовать две-три буквы или специальные символы. Иначе обратное преобразование из транслита в оригинальный текст без потерь будет невозможна.

Когда-то я задавал себе все эти вопросы и решил найти свой наиболее оптимальный вариант транслитерации русских букв в латиницу. Когда-то ещё на заре появления мобильных технологий мне попалась одна небольшая книжечка от сервиса БиОнЛайн, где и приводилась таблица соответствия букв русского и английского алфавитов. Не сложно догадаться, что при отправке SMS тоже очень часто применяется транслитерация. С точки зрения телекоммуникаций, чем меньше символов мы выделяем для передачи нашего сообщения, тем эффективнее наша система передачи.

А Б В Г Д Е Ё
A B V G D E YO
Ж З И Й К Л М
ZH Z I J K L M
Н О П Р С Т У
N O P R S T U
Ф Х Ц Ч Ш Щ Ъ
F H TS CH SH SCH "
Ы Ь Э Ю Я
Y ' E YU YA

В общем, так я решил использовать эту таблицу для транслитерации русских букв в латиницу.

Немного побродив по рунету я нашёл несколько сайтов, где были представлены алгоритмы преобразования в транслит на PHP. И выбрав из них всё самое лучшее и наиболее эффективное написал 3 функции для преобразования в транслит и обратно и для преобразования строки в валидный url-адрес.

Итак, ниже привожу листинг этих функций:

Функция для преобразования в транслит:

function translit($input, $noloss=false) {
    if($noloss == true) {
        $replace1 = array('Ъ'=>'"\'', 'Ь'=>'\'\'', 'Э'=>'E\'', 'э'=>'e\'');
        $input = strtr((string)$input, $replace1);
    }
    $replace = array(
    'А'=>'A',    'Б'=>'B',    'В'=>'V',    'Г'=>'G',    'Д'=>'D',    'Е'=>'E',
    'Ё'=>'YO',   'Ж'=>'ZH',   'З'=>'Z',    'И'=>'I',    'Й'=>'J',    'К'=>'K',
    'Л'=>'L',    'М'=>'M',    'Н'=>'N',    'О'=>'O',    'П'=>'P',    'Р'=>'R',
    'С'=>'S',    'Т'=>'T',    'У'=>'U',    'Ф'=>'F',    'Х'=>'H',    'Ц'=>'TS',
    'Ч'=>'CH',   'Ш'=>'SH',   'Щ'=>'SCH',  'Ъ'=>'"',    'Ы'=>'Y',    'Ь'=>'\'',
    'Э'=>'E',    'Ю'=>'YU',   'Я'=>'YA',

    'а'=>'a',    'б'=>'b',    'в'=>'v',    'г'=>'g',    'д'=>'d',    'е'=>'e',
    'ё'=>'yo',   'ж'=>'zh',   'з'=>'z',    'и'=>'i',    'й'=>'j',    'к'=>'k',
    'л'=>'l',    'м'=>'m',    'н'=>'n',    'о'=>'o',    'п'=>'p',    'р'=>'r',
    'с'=>'s',    'т'=>'t',    'у'=>'u',    'ф'=>'f',    'х'=>'h',    'ц'=>'ts',
    'ч'=>'ch',   'ш'=>'sh',   'щ'=>'sch',  'ъ'=>'"',    'ы'=>'y',    'ь'=>'\'',
    'э'=>'e',    'ю'=>'yu',   'я'=>'ya');
    return strtr((string)$input, $replace);
}

Функция для преобразования из транслита в обычный текст:

function antitranslit($input, $noloss=false) {
    if($noloss == true) {
        $replace1 = array('"\''=>'Ъ', '\'\''=>'Ь', 'E\''=>'Э', 'e\''=>'э');
        $input = strtr((string)$input, $replace1);
    }
    $replace = array(
    'A'=>'А',    'B'=>'Б',    'V'=>'В',    'G'=>'Г',    'D'=>'Д',    'E'=>'Е',
    'YO'=>'Ё',   'ZH'=>'Ж',   'Z'=>'З',    'I'=>'И',    'J'=>'Й',    'K'=>'К',
    'L'=>'Л',    'M'=>'М',    'N'=>'Н',    'O'=>'О',    'P'=>'П',    'R'=>'Р',
    'S'=>'С',    'T'=>'Т',    'U'=>'У',    'F'=>'Ф',    'H'=>'Х',    'TS'=>'Ц',
    'CH'=>'Ч',   'SH'=>'Ш',   'SCH'=>'Щ',  'Y'=>'Ы',    'YU'=>'Ю',   'YA'=>'Я',

    'a'=>'а',    'b'=>'б',    'v'=>'в',    'g'=>'г',    'd'=>'д',    'e'=>'е',
    'yo'=>'ё',   'zh'=>'ж',   'z'=>'з',    'i'=>'и',    'j'=>'й',    'k'=>'к',
    'l'=>'л',    'm'=>'м',    'n'=>'н',    'o'=>'о',    'p'=>'п',    'r'=>'р',
    's'=>'с',    't'=>'т',    'u'=>'у',    'f'=>'ф',    'h'=>'х',    'ts'=>'ц',
    'ch'=>'ч',   'sh'=>'ш',   'sch'=>'щ',  '"'=>'ъ',    'y'=>'ы',    '\''=>'ь',
    'yu'=>'ю',   'ya'=>'я');
    return strtr((string)$input, $replace);
}

Функция для преобразования строки в валидный url-адрес:

function string2url($s,$cyrillic=false) {
    $s = trim(strip_tags(html_entity_decode((string)$s,ENT_QUOTES|ENT_XHTML,'utf-8'))); // убираем HTML-теги, символы   " < > лишние пробелы в начале и в конце строк
    $s = function_exists('mb_strtolower') ? mb_strtolower($s,'utf-8') : strtolower($s); // переводим строку в нижний регистр (иногда надо задать локаль)
    if ($cyrillic == true) {$pattern = '#[^-0-9a-zа-яё\s]+#u';} // оставлять кириллические символы
    else {$pattern = '#[^-0-9a-z\s]+#u';}
    $s = preg_replace($pattern, '', $s); // очищаем строку от недопустимых символов (оставляем дефис, цифры, буквы, пробельные символы)
    $s = preg_replace("#[-\s]+#u", '-', $s); // заменяем пробелы и лишние дефисы одним дефисом
    $s = trim($s, '-'); // удаляем начальные и конечные дефисы
    $s_length = mb_strlen($s,'utf-8'); // вычисляем длину полученной строки
    if ($s_length>255) { // если длина строки больше 255 символов,
        $s = mb_substr($s, 0, 255, 'utf-8'); // то отрезаем её до 255 символов
    };
    return $s; // возвращаем результат
}

Добавлю немного разъяснений как они работают.

Функции translit() и antitranslit() очень похожи и занимаются непосредственно заменой одних символов другими. На входе они принимают два параметра:

1 - входные данные $input - любую исходную строку

2 - необязательный параметр $noloss - для преобразования исходной строки без потерь, в случае если $noloss = true, входной текст можно будет без потерь восстановить обратно.

Работа этих функций основана на встроенной php-функции strtr ( string $str , array $replace_pairs ), которая преобразует заданные символы или заменяет подстроки .

strtr() может вызываться с двумя аргументами. В этом случае from должен быть массивом (array), в форме array('from' => 'to', ...). Функция возвратит строку, в которой все ключи массива будут заменены их элементами. strtr() в первую очередь заменяет более длинные ключи, причем одна и та же строка поиска используется только один раз. В этом случае, ключи и значения могут иметь любую длину, за исключением того, что ключи не должны быть пустыми. Кроме того, длина возвращаемого значения может отличаться от str. Однако, стоит учесть тот факт, что эта функция максимально эффективна в том случае, если все ключи имеют одинаковый размер.

Естественно, массивы для преобразования одних символов другими можно изменить своими наборами символов. И это будут ещё другие варианты для получения транслитерации кириллического текста.

Функция string2url() преобразует обычную строку $s в url-адрес:

Вначале происходит преобразование HTML-сущностей в соответствующие символы функций html_entity_decode().

Далее происходит очистка строки от HTML-тегов и начальных/конечных пробелов функциями strip_tags и trim() соответственно.

Далее происходит преобразование регистра букв в нижний регистр функциями strtolower() или mb_strtolower() (для кодировки utf-8).

Если вторым параметром $cyrillic функция string2url() принимает true, то при дальнейшем преобразовании кириллические символы от а до я остаются. Иначе - они удаляются вместе со всеми недопустимыми символами. Все допустимые символы представлены в регулярных выражениях #[^-0-9a-z\s]+#u и #[^-0-9a-zа-яё\s]+#u - выборка всех символов, не являющимися дефисом, цифрами от 0 до 9, строчными буквами от a до z, и от a до я и буквой ё и пробельными символами, обозначенными \s, параметр u в конце обозначает любую строку в формате Юникода.

После выборки всех недопустимых символов функция preg_replace() их заменяет пустой строкой.

Далее та же функция preg_replase() заменяет все пробельные символы и дефисы одним дефисом. И после этого если в начале или в конце остался лишний дефис, то он удаляется функцией trim().

Для некоторых браузеров, например старых версий Internet Explorer максимальная длина url-адреса составляла 2048 байт. Хотя современные браузеры поддерживают url-запросы ещё большей длины, всё же лучше ограничить достаточно длинную строку конечным числом символов, чтобы избежать возможных ошибок и зависаний браузеров. Да и пользователю будет легче скопировать и передать более короткий url-адрес.

Поэтому функцией mb_strlen() вычисляем длину полученной строки и если она превышает 255 символов, отрезаем всё лишнее при помощи функции mb_substr().

На этом все преобразования завершены и возвращается результат - строка, допустимая для применения валидных url-адресов и названий файлов.

В приложенном файле translit.php, который вы можете скачать по ссылкам ниже, приводятся примеры работы описанных функций транслитерации и приводятся ссылки на другие сайты по этой теме.

Если вы также пишете сайты на php или задаётесь вопросами о транслитерации, то думаю этот материал будет вам полезен. Пользуйтесь.


Вы вошли на сайт как Гость.




Понравился материал?
Поделись со своими друзьями в социальных сетях!


Комментарии:

Здесь комментариев пока нет.

Оставить комментарий
Ваш e-mail необходим только для связи с Вами и не публикуется на сайте
Введите сумму чисел с картинки = 
* Звёздочкой помечены обязательные поля для заполнения
Вход
Вы вошли на сайт, как Гость


Внешний вид сайта

Какой вид сайта Вы предпочитаете?



Telegram
Подпишись на Telegram-канал, чтобы первым узнать все новости сайта:
Подпишись на Telegram-канал, чтобы первым узнать все новости сайта
Рассылка
Подпишитесь на рассылку наших новостей, чтобы всегда быть в курсе последних обновлений!


* Звёздочкой помечены обязательные поля для заполнения
Ваши данные никому не передаются. Вы можете отписаться от рассылки новостей в любой момент.
Статистика
Сейчас на сайте:
Cтатей: 136
Партнёрских продуктов: 179
Файлов: 93
Секретных материалов: 144
Обучающих курсов: 302
Товаров: 6
Галерей: 2
Альбомов: 1
Категорий: 32
Партнёров: 16
Заметок: 27
Комментариев: 16
Мудрых фраз: 146
Страниц: 6
Пользователей: 106
Подписчиков: 165
Посетителей на сайте: 23
Реклама
Группа Вконтакте
Группа Facebook
 Наверх