@Richard_Ferlow
Веб-программист

Как перевести название материала с русского в транслит url совместимый?

В общем база стран-курортов и у каждой свой адрес должен быть.
Соответственно из названия нужно перевести русский в URL вид.
в CMS которой пользуюсь есть встроенная функиция, но она некорректно отрабатывает, особенно если есть спец символы в строке

например - Рас-эль-Хайма - делает как - hajma
Абу Даби / Аль Айн - dabi
Более менее такиого типа только(до двух символов съела):
Бронируем отели по ценам BOOKING.COM - broniruem-oteli-cenam-booking


можно конечно копаться в функции и выяснять где там чего не так, но она объемная и многие вещи не до конца понимаю что делают. Ну и думаю что наверняка есть же готовая-рабочая-отлаженная функция? Как найти?
  • Вопрос задан
  • 2360 просмотров
Решения вопроса 1
@itcoder
Вот рабочий вариант:

UrlTranslitBehavior::makeUrlLink('Рас-эль-Хайма');

<?php
class UrlTranslitBehavior{

	
	protected static function u_strtr ($value, $to, $from = null)
	{
		if (is_null ($from))
		{
			arsort ($to, SORT_LOCALE_STRING);
			foreach ($to as $c => $r)
			{
				$value = str_replace ($c, $r, $value);
			}
		}
		else
		{
			$len = min (strlen ($to), strlen ($from));
			for ($i = 0; $i < $len; ++$i)
			{
				$value = str_replace (
					mb_substr ($to, $i, 1, 'UTF-8'),
					mb_substr ($from, $i, 1, 'UTF-8'), 
					$value
				);
			}
		}
		return $value;
	}
	

	public static function translit ($value)
	{
		$value = trim ($value);
		
		$value = str_replace (
			array ("\r", "\n", "\t", ',', '.', '(', ')', '[', ']', '{', '}'),
			'',
			$value
		
		);
		
		if (!isset ($lang))
		{
			$regexpRus = '/^[а-яА-Я]+/';
			$lang = preg_match ($regexpRus, $value) ? 'ru' : 'en';
		}
			// Сначала заменяем "односимвольные" фонемы.
			$value = self::u_strtr ($value, "абвгдеёзийклмнопрстуфхыэ ", "abvgdeeziyklmnoprstufhie-");
			$value = self::u_strtr ($value, "АБВГДЕЁЗИЙКЛМНОПРСТУФХЫЭ ", "ABVGDEEZIYKLMNOPRSTUFHIE-");

			// Затем - "многосимвольные".
			$value = self::u_strtr (
				$value,
				array (
					"ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
					"щ"=>"shch","ь"=>"", "ъ"=>"", "ю"=>"yu", "я"=>"ya",
					"Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
					"Щ"=>"SHCH","Ь"=>"", "Ъ"=>"", "Ю"=>"YU", "Я"=>"YA",
					"ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye",
					"&nbsp;"=>"-"
				)
			);
			
		return $value;
	}
	

	public static function makeUrlLink ($value)
	{
       	        $link = self::translit ($value, 'en');
		$link = preg_replace ('/([^0-9a-zA-Z_])+/', '-', $link);
		$link = preg_replace ('/[_]{2,}/', '_', $link);
		$link = preg_replace ('/^_/', '', $link);
		$link = preg_replace ('/_$/', '', $link);
		$link = trim($link,'-');
		return strtolower($link);
	}
	
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы