02.08.2019 08:29:00
Периодически встречаются задачи, где требуется перевести русский текст в транслит. Например, из имени и фамилии человека сделать почту и перевести ее в транслит, или символьный код новости для ЧПУ сформировать. Мы рассмотрим два варианта решения: 1) для любых сайтов на php и 2) для битрикса
Первый вариант универсальный может использоваться на всех сайтах, так как мы напишем php функцию для транслита. Для этого нам понадобится два массива: один с русскими буквами, второй с буквами на транслите и функцию str_replace.
Если мы посмотрим документацию, то там сказано
Если и search, и replace - массивы, то str_replace() использует все значения массива search и соответствующие значения массива replace для поиска и замены в subject. Если в массиве replace меньше элементов, чем в search, в качестве строки замены для оставшихся значений будет использована пустая строка.
$russian = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
$translit = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
А значит нам достаточно просто передать эти два массива и строку для получения транслита.
Создадим функцию translit
function translit($str) {
$russian = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
$translit = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
return str_replace($russian, $translit, $str);
}
echo translit("Русский текст в транслит");?>
Но не будем забывать, что некоторые буквы в транслите могут содержать апостроф, который недопустим в ЧПУ, поэтому данный массив $translit не содержит апостроф. Все таки мы это делаем для получения ЧПУ.
2) Вариант для Битрикс. В битриксе уже заложено много полезных функций, в том числе и транслит.
Cutil::translit($name,$lang,$params);
где
$name - строка текста для транслита
$lang - язык с которого производится транслитерация
$params - параметры перевода
Массив параметров:
max_len ограничение количества символов, по умолчанию - 100
change_case к какому регистру приводить: L - к нижнему, U - к верхнему, false - не изменять. По умолчанию - "L"
replace_space чем заменять пробел, по умолчанию: "_"
replace_other чем заменять прочие символы, по умолчанию: "_"
delete_repeat_replace удалять повторяющиеся пробелы, по умолчанию - "true"
safe_chars строка из символов, замена которых не производится
За нас уже все придумали. Нам надо только вывести его
<?
$name = "Русский текст в транслит";
$arParams = array("replace_space"=>"-","replace_other"=>"-");
$trans = Cutil::translit($name,"ru",$arParams);
echo $trans;
?>