KaMaToZzz
@KaMaToZzz

Функция Slugify и кириллица в шаблоне?

Приветствую,

В шаблоне есть функция:

function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\\pL\d]+~u', '-', $text);

  // trim
  $text = trim($text, '-');

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // lowercase
  $text = strtolower($text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  if (empty($text))
  {
    return 'n-a';
  }

  return $text;
}

Потом есть ее использование:

$link =  $item->url; 

						if ($pageType == '2' || $pageType=='')
						{
							$link =  $item->url;
						}
						elseif ($pageType == '1')
						{
							$link = get_site_url().'/#'.slugify($item->title);
							//$link = '#'.slugify($item->title);
							//$link = @$custom['_custom_url'][0];
						}
						else
						{
							$link =  $item->url;
						}

Проблема в том, что первая функция не обрабатывает кириллицу, а вторая соответсвенно получает #n-a ну и просто его присоединяет к url'у

Подскажите, пожалуйста, как с минимальным вмешательством в уже сформированную структуру шаблона научить его понимать кириллицу?
  • Вопрос задан
  • 828 просмотров
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Как вариант, можно использовать Transliterator::transliterate() (требуется расширение intl).

function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\\pL\d]+~u', '-', $text);

  // trim
  $text = trim($text, '-');

  // transliterate
  if (extension_loaded('intl')) {
    $translit = Transliterator::create('Any-Latin; Latin-ASCII');
    $text = $translit->transliterate($text);
  } else {
    $map = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',  'г' => 'g',  'д' => 'd',  'е' => 'e',  'ж' => 'zh', 'з' => 'z',
        'и' => 'i',   'й' => 'y',   'к' => 'k',  'л' => 'l',  'м' => 'm',  'н' => 'n',  'о' => 'o',  'п' => 'p',
        'р' => 'r',   'с' => 's',   'т' => 't',  'у' => 'u',  'ф' => 'f',  'х' => 'h',  'ц' => 'ts', 'ч' => 'ch',
        'ш' => 'sh',  'щ' => 'sht', 'ъ' => 'y',  'ы' => 'y',  'ь' => '\'', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A',
        'Б' => 'B',   'В' => 'V',   'Г' => 'G',  'Д' => 'D',  'Е' => 'E',  'Ж' => 'Zh', 'З' => 'Z',  'И' => 'I',
        'Й' => 'Y',   'К' => 'K',   'Л' => 'L',  'М' => 'M',  'Н' => 'N',  'О' => 'O',  'П' => 'P',  'Р' => 'R',
        'С' => 'S',   'Т' => 'T',   'У' => 'U',  'Ф' => 'F',  'Х' => 'H',  'Ц' => 'Ts', 'Ч' => 'Ch', 'Ш' => 'Sh',
        'Щ' => 'Sht', 'Ъ' => 'Y',   'Ь' => '\'', 'Ю' => 'Yu', 'Я' => 'Ya'
    );
    $text = strtr($text, $map);
  }
  
  // lowercase
  $text = strtolower($text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  if (empty($text)) {
    $text = 'n-a';
  }

  return $text;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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