Bitrix: Транслитерация

15/12/2022

Для транслитерации в Битрикс используется метод Cutil::translit($str, $lang, $params = array())

Функция транслитерирует строку $str с языка $lang с параметрами $params

Массив $params

Параметр Значение по умолчанию Описание
"max_len" 100 Максимальная длина результата транслитерации
"change_case" L Приведение результата к регистру, L - к нижнему, U - верхнему
"replace_space" _ Замена для символа пробела
"replace_other" _ Замена для прочих символов
"delete_repeat_replace" true Удалять лишние символы замены
safe_chars " Символы которые не нужно транслитерировать
use_google false Новый, пока не используется

Пример использования


$str = "Текст для транслитерации";
$params = array("replace_space"=>"-","replace_other"=>"-");
$result = Cutil::translit($str, "ru", $params);
echo $result;

Иногда, этот метод не работает (в нем есть ошибка, которая проявляется на UTF-8 сайтах)

В таком случае есть 2 пути:

1. Исправить код метода(это риск потерять изменения при обновлении битрикса):

сам метод находится в файле /bitrix/modules/main/tools.php:

Нужно в нем заменить строчку:


$chr = substr($str, $i, 1);

На:


$chr = mb_substr($str, $i, 1, 'UTF-8'); 

2. Использовать для транслитерации свою функцию:

Как пример можно взять следующий код;


class Translit
{
	function Transliterate($string)
	{
		$cyr = array(
				"Щ",  "Ш", "Ч", "Ц","Ю", "Я", "Ж", "А","Б","В","Г","Д","Е","Ё","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х", "Ь","Ы","Ъ","Э","Є","Ї",
				"щ",  "ш", "ч", "ц","ю", "я", "ж", "а","б","в","г","д","е","ё","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х", "ь","ы","ъ","э","є","ї"
		);
		$lat = array(
				"Shh","Sh","Ch","C","Ju","Ja","Zh","A","B","V","G","D","Je","Jo","Z","I","J","K","L","M","N","O","P","R","S","T","U","F","Kh","'","Y","`","E","Je","Ji",
				"shh","sh","ch","c","ju","ja","zh","a","b","v","g","d","je","jo","z","i","j","k","l","m","n","o","p","r","s","t","u","f","kh","'","y","`","e","je","ji"
		);
		for ($i=0; $i < count($cyr); $i++)
		{
			$c_cyr = $cyr[$i];
			$c_lat = $lat[$i];
			$string = str_replace($c_cyr, $c_lat, $string);
		}
		$string = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]e/", "\${1}e", $string);
		$string = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]/", "\${1}'", $string);
		$string = preg_replace("/([eyuioaEYUIOA]+)[Kk]h/", "\${1}h", $string);
		$string = preg_replace("/^kh/", "h", $string);
		$string = preg_replace("/^Kh/", "H", $string);
		return $string;
	}
	function UrlTranslit($string)
	{
		$string = preg_replace("/[_\s\.,?!\[\](){}]+/", "-", $string);
		$string = preg_replace("/-{2,}/", "--", $string);
		$string = preg_replace("/_-+_/", "--", $string);
		$string = preg_replace("/[_\-]+$/", "", $string);
		$string = Translit::Transliterate($string);
		$string = ToLower($string);
		$string = preg_replace("/j{2,}/", "j", $string);
		$string = preg_replace("/[^0-9a-z_\-]+/", "-", $string);
		return $string;
	}
}
$trans = Translit::UrlTranslit("бла бла бла 123");
echo $trans;

Теги - Bitrix