Класс UrlTransliteration для транслитерации строк с последующим использованием в урлах

Категория: Web
Опубликовано 15.12.2012 04:00

Добавляю в движок поддержку ЧПУ(friendly url которые). Общая схема такая: дополнительно к названию элемент имеет алиас. Этот алиас может быть как заполнен пользователем, так и сгенерирован из названия. В обоих случаях алиас проходит через обработку транслитератора, который кроме собственно транслитерации русских символов в латинские, еще режет все неразрешенные символы.

Выкладываю класс, вдруг кому пригодится.

using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
namespace JonxxxMVC.Code
{
    public static class UrlTransliteration
    {
        private static readonly Dictionary<char, string> Dictionary = new Dictionary<char, string> { { 'а', "a" }, { 'б', "b" }, { 'в', "v" }, { 'г', "g" }, { 'д', "d" }, { 'е', "e" }, { 'ё', "e" }, { 'ж', "zh" }, { 'з', "z" }, { 'и', "i" }, { 'й', "y" }, { 'к', "k" }, { 'л', "l" }, { 'м', "m" }, { 'н', "n" }, { 'о', "o" }, { 'п', "p" }, { 'р', "r" }, { 'с', "s" }, { 'т', "t" }, { 'у', "u" }, { 'ф', "f" }, { 'х', "kh" }, { 'ц', "ts" }, { 'ч', "ch" }, { 'ш', "sh" }, { 'щ', "sch" }, { 'ъ', "" }, { 'ы', "y" }, { 'ь', "" }, { 'э', "e" }, { 'ю', "yu" }, { 'я', "ya" }, { ' ', "-" } };
        private static readonly Regex Regex = new Regex(@"^[a-z0-9\-,\._]{1}$");
        private const int MaxLength = 50;
 
        public static string Transliterate(string text)
        {
            //транслитерация
            text = text.ToLower();
            StringBuilder trls = new StringBuilder();
            foreach (char c in text)
            {
                if (Dictionary.Any(i => i.Key == c))
                    trls.Append(Dictionary.Single(i => i.Key == c).Value);
                else
                    trls.Append(c);
            }
 
            //удаление ненужных символов
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < trls.Length; i++)
            {
                if (Regex.Matches(trls[i].ToString(CultureInfo.InvariantCulture)).Count == 1)
                    result.Append(trls[i]);
            }
            return result.Length > MaxLength ? result.ToString(0, MaxLength) : result.ToString();
        }
    }
}

Поля:

  • Dictionary - словарь транслитерации
  • Regex - шаблон-регулярка, в котором указаны допустимые символы
  • MaxLength - максимальная длина строки на выходе

Критика и вопросы приветствуются.

Комментарии   

0 # Анатолій 07.04.2015 17:55
Пригодилось, дякую! Побачив герб Львова! Настальгія.... :sigh:
Ответить | Ответить с цитатой | Цитировать