Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 19 мар 2024, 11:45

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Метод для создания slug (транслит)
СообщениеДобавлено: 26 авг 2012, 06:53 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Не знаю сюда или не сюда написал, пусть админ перенесет куда нужно или скажет мнение.
Думаю, нужно создать раздел для такого - чтобы можно было создавать тему и выкладывать код.
Потом по темам можно быстро найти нужное (если название "говорящее") и можно будет обсудить и дополнить именно этот код.
Т.е. не все в одной теме как здесь: раздел "обмен исходниками" viewtopic.php?f=16&t=335
Как думаете?

Теперь, собственно, по теме)
Как-то понадобилось функция транслита для использования названия статьи в url.
Функции как бы есть, но только с русского языка.
Потом в CakePHP высмотрел метод для различных символов (только там как раз и не было для русских и украинских символов) Перенес его в кохановский Inflector.
Добавил русские и украинские символы и вот что вышло. Теперь им пользуюсь.
Код:
<?php defined('SYSPATH') or die('No direct script access.');

/**
 * Inflector helper class.
 *
 * @package    Kohana
 * @category   Helpers
 */
class Inflector extends Kohana_Inflector
{
    /**
     * Default map of accented and special characters to ASCII characters
     *
     * @var array
     */
    protected static $_transliteration = array(
        '/ä|æ|ǽ/' => 'ae',
        '/ö|œ/' => 'oe',
        '/ü/' => 'ue',
        '/Ä/' => 'Ae',
        '/Ü/' => 'Ue',
        '/Ö/' => 'Oe',
        '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|А/' => 'A',
        '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|а/' => 'a',
        '/Б/' => 'B',
        '/б/' => 'b',
        '/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
        '/ç|ć|ĉ|ċ|č/' => 'c',
        '/Ð|Ď|Đ|Д/' => 'D',
        '/ð|ď|đ|д/' => 'd',
        '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Е|Э|Є/' => 'E',
        '/è|é|ê|ë|ē|ĕ|ė|ę|ě|е|э|є/' => 'e',
        '/Ф/' => 'F',
        '/ƒ|ф/' => 'f',
        '/Ĝ|Ğ|Ġ|Ģ|Г|Ґ/' => 'G',
        '/ĝ|ğ|ġ|ģ|г|ґ/' => 'g',
        '/Ĥ|Ħ/' => 'H',
        '/ĥ|ħ/' => 'h',
        '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|І|И/' => 'I',
        '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|і|и/' => 'i',
        '/Ĵ|Й/' => 'J',
        '/ĵ|й/' => 'j',
        '/Ķ|К/' => 'K',
        '/ķ|к/' => 'k',
        '/Ĺ|Ļ|Ľ|Ŀ|Ł|Л/' => 'L',
        '/ĺ|ļ|ľ|ŀ|ł|л/' => 'l',
        '/М/' => 'M',
        '/м/' => 'm',
        '/Ñ|Ń|Ņ|Ň|Н/' => 'N',
        '/ñ|ń|ņ|ň|ʼn|н/' => 'n',
        '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|О/' => 'O',
        '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|о/' => 'o',
        '/П/' => 'P',
        '/п/' => 'p',
        '/Ŕ|Ŗ|Ř|Р/' => 'R',
        '/ŕ|ŗ|ř|р/' => 'r',
        '/Ś|Ŝ|Ş|Š|С/' => 'S',
        '/ś|ŝ|ş|š|ſ|с/' => 's',
        '/Ţ|Ť|Ŧ|Т/' => 'T',
        '/ţ|ť|ŧ|т/' => 't',
        '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|У/' => 'U',
        '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|у/' => 'u',
        '/В/' => 'V',
        '/в/' => 'v',
        '/Ý|Ÿ|Ŷ|Ы/' => 'Y',
        '/ý|ÿ|ŷ|ы/' => 'y',
        '/Ŵ/' => 'W',
        '/ŵ/' => 'w',
        '/Ź|Ż|Ž|З/' => 'Z',
        '/ź|ż|ž|з/' => 'z',
        '/Æ|Ǽ/' => 'AE',
        '/ß/'=> 'ss',
        '/IJ/' => 'IJ',
        '/ij/' => 'ij',
        '/Œ/' => 'OE',

        // Составные (русский, украинский)
        '/ё/' => 'yo',   '/Ё/' => 'Yo',
        '/ж/' => 'zh',   '/Ж/' => 'Zh',
        '/х/' => 'kh',   '/Х/' => 'Kh',
        '/ц/' => 'ts',   '/Ц/' => 'Ts',
        '/ч/' => 'ch',   '/Ч/' => 'Ch',
        '/ш/' => 'sh',   '/Ш/' => 'Sh',
        '/щ/' => 'shch', '/Щ/' => 'Shch',
        '/ю/' => 'yu',   '/Ю/' => 'Yu',
        '/я/' => 'ya',   '/Я/' => 'Ya',
        '/ї/' => 'ji',   '/Ї/' => 'Ji',

        // Спецсимволы
        '/ъ|Ъ|ь|Ь/' => '', // Твердые и мягкие знаки
        '/&/' => ' and ',  // Амперсанд
        '/\'/' => '',      // Апостроф
    );


    /**
     * Returns a string with all spaces converted to underscores (by default), accented
     * characters converted to non-accented characters, and non word characters removed.
     *
     * @static
     * @param $string $string the string you want to slug
     * @param string  $replacement will replace keys in map
     * @param bool    $tolower все в нижний регистр
     * @return mixed
     * @link http://book.cakephp.org/2.0/en/core-utility-libraries/inflector.html#Inflector::slug
     */
    public static function slug($string, $replacement = '-', $tolower = TRUE)
    {
        $string = ($tolower) ? UTF8::strtolower($string) : $string;

        $quoted_replacement = preg_quote($replacement, '/');

        $merge = array(
            '/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
            '/\\s+/' => $replacement,
            sprintf('/^[%s]+|[%s]+$/', $quoted_replacement, $quoted_replacement) => '',
        );

        $map = self::$_transliteration + $merge;
        
        return preg_replace
(array_keys($map), array_values($map), $string);
    }
}
 

Вроде все символы на месте, если что - можно подправить или убрать не нужное)

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 авг 2012, 16:23 
Не в сети
Бывалый

Зарегистрирован: 21 май 2012, 20:54
Сообщения: 81
У меня тоже была проблема отображения разных символов в названиях в url.Я решил задачу с помощью хелпера

class Helper_MyUrl
{
public static function SEOIt($str)
{
$u = array(' ','.','"',')','(',':',',');//Сюда добавляется все что нужно заменить
$str = str_replace($u, '-', $str[0]);
return $str;
}
}

_________________
Меньше кода -> меньше ошибок


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 авг 2012, 16:30 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Ну так и выйдет - то, что нужно заменить находится в массиве $_transliteration

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group