Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример).
Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать?
В Django по умолчанию есть готовая функция slugify для таких случаев.
Но я её никогда не использую. Почему? Потому что её недостаточно!
Приведём пример
>>> from django.utils.text import slugify
>>> slugify('This is a Title')
'this-is-a-title'
Пока всё отлично
>>> slugify('This is a "Title!"')
'this-is-a-title'
Спец символы удалились, всё хорошо.
>>> slugify('Это заголовок статьи')
''
Вот и приехали 😢. Если текст не английский то буквы просто игнорируются. Можно это поправить
>>> slugify('Это заголовок статьи', allow_unicode=True)
'это-заголовок-статьи'
Но тогда мы не вписываемся в условие. У нас появилась кириллица в тексте.
Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою.
Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку:
🔸1. Исходный текст:
>>> text = 'Мой заголовок №10 😁!'
Взял специально посложней со специальными символами.
🔸2. Транслит
Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги.
from unidecode import unidecode
>>> unidecode("Ñ Σ ® µ ¶ ¼ 月 山")
'N S (r) u P 1/4 Yue Shan'
Очень крутая библиотека, советую👍
В нашем случае получаем такое преобразование:
>>> text = unidecode(text)
>>> print(text)
'Moi zagolovok No. 10 !'
Отличный транслит. Смайл просто удалился, хотя я ждал что-то вроде :). Ну и ладно, всë равно невалидные символы.
А еще наш код уже поддерживает любой язык, будь то хинди или корейский.
🔸4. Фильтр символов
Unidecode не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона.
>>> text = re.sub(r'[^a-zA-Z0-9]+', '_', text)
>>> print(text)
'Moi_zagolovok_No_10_'
Символ "+" в паттерне выручает когда несколько недопустимых символов идут рядом. Все они заменяются на один символ "_".
🔸5. Slugify
Осталось удалить лишние символы по краям и сделать нижний регистр
>>> text = text.strip('_').lower()
>>> print(text)
'moi_zagolovok_no_10'
Получаем отличный slug! 😎
🌎 Полный код в виде функции.
______________
PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию.
#libs#tricks#django
Новый год – это время волшебства, подарков, оживших сказок, самых счастливых эмоций и радостных улыбок. Тысячи разноцветных огней освещают улицы города, наряженные ели, удивительные и необычные украшения создают особую атмосферу новогоднего праздника. В это время каждый может почувствовать себя героем сказки, поверить в волшебство и загадать свои самые заветные желания. Команда отеля дарит каждому гостю волшебную открытку, отправляйте её тому, кого хотите поздравить с праздниками и вместе с открыткой к Вашим друзьям и близким отправится частичка счастья, добра и волшебства!🎄
⠀
#отельпекинмосква#hotelpekingmoscow#pekinghotel#newyear #новыйгод2022#пекинмосква #гостиницамосква
Дорогие, милые дамы,
Команда отеля Пекин поздравляет вас с Международным женским днём!
Желаем вам чудесных дней, наполненных радостными событиями, красивыми словами, любовью и душевностью.
Пусть ваши желания исполняются всё чаще, близкие окружают вас теплом и нежностью, заботой и безграничным вниманием.
Счастья вам, прекрасные дамы, и пусть оно не заканчивается!
Мы всегда ждём вас в отеле Пекин!
#гостиницапекинмосква#пекинмосква#8марта#hotelpekingmoscow#pekinghotel#pekinghotelmoscow
Зима — большая волшебная сказка. В ней три главы и бесконечное число чудес на каждой страничке. В каждом слове этой волшебной истории живёт по маленькому чуду!
Декабрь — «О том, как чувствовать волшебство»
Январь — «О том, как придумать волшебство самому»
Февраль — «О том, что волшебство — в тебе»
⠀
Позволь себе окунуться в мир волшебства, бронируй новогодние каникулы на сайте: www.hotelpeking.ru либо по телефону: +7 495 980 59 95 и получай скидку от 10%💫
⠀
#hotelpekingmoscow#pekinghotel#moscow#newyear#holidays#отельпекинмосква#гостиницапекинмосква
С праздником Великой Победы!
Мирного неба, ясного солнца, доброй жизни вокруг!
Светлая память героям войны и их подвигам!
#9мая#9мая2021#76летпобеды#pekinghotel#hotelpekin#hotelpeking#pekinghotelmoscow
1 июня отмечается Международный день защиты детей!
Задача каждого взрослого - сделать детство счастливым и беззаботным.
А мы #pekinghotelteam делаем все, чтобы нашим маленьким гостям и их родителям было уютно и комфортно в нашем отеле. Для малышей у нас есть:
✅детские кроватки
✅стульчики для кормления
✅игрушки
✅подогреватели и стерилизаторы для бутылочек
✅ванночки для купания и даже горшок!
Все, что нужно для отличного отдыха!
Ждем вас в отеле “Пекин”!
Москва, Большая Садовая, д.5
#hotelpeking#pekinghotel#hotelpekin#pekinghotelmoscow#гостиницапекин#гостиницапекинмосква#отдыхсдетьми#семейныевыходные
Тариф “Привилегии особого выбора” - для тех, кто ценит комфорт класса “люкс” во всем.
Для наших гостей:
✅Проживание в номере категории «люкс»*
✅Ранний заезд, после 11.00
✅Поздний выезд, до 16.00
✅Комплемент от отеля
✅Парковочное место для вашего автомобиля.
Бронируйте на официальном сайте www.hotelpeking.ru
Москва, Большая Садовая, д.5
#отельпекинмосква#гостиницапекин#отельпекинмосква#номерлюкс#стандартныйномер#гостиницапекинмосква#pekinghotelmoscow#hotelpekingmoscow#hotelpekin#pekinghotel
Длинные майские праздники закончились и впереди нас снова ждут рабочие дедлайны, спешка, деловые встречи.
Легко настроиться на рабочий лад помогают мысли о предстоящем путешествии. Почему бы не устроить себе мини-отпуск в самом центре столицы? Забронируйте проживание в отеле “Пекин” и окунитесь в весеннюю атмосферу одного из самых красивых городов мира.
Театры, концертные залы, музеи, шикарные парки - все это в шаговой доступности от отеля.
Живите в “Пекине”, наслаждайтесь Москвой!
Бронируйте номера по телефону 8 800 250 05 50 или на официальном сайте по ссылке в шапке профиля.
Москва, Большая Садовая, д.5
#отельвцентремосквы#забронироватьгостиницу#отельпекин#гостиницапекин#гостиницапекинмосква#пекинотель#pekinghotelmoscow#hotelpekingmoscow#pekinghotel
Апартаменты “Золотой Сад” просторный двухкомнатный номер высшей категории, состоящий из большой спальни с двуспальной кроватью размера King size, гостиной с мягкой мебелью, обеденной зоны с кухонным уголком.
Идеальный вариант для размещения семьи.
Номер оснащен всем необходимым для длительного проживания, а дизайнерское решение в пастельных тонах способствует созданию уютной домашней атмосферы. Вся мебель выполнена из натурального дерева.
В ванной комнате: душевая кабина, биде, фен, косметические принадлежности, махровый халат и тапочки. Номер оборудован мини-кухней, чайной станцией, удобной обеденной зоной.
Бронируйте на официальном сайте www.hotelpeking.ru
#забронироватьгостиницу#стандартныйномер#номерлюкс#гостиницапекин#отельпекин#отельпекинмосква#hotelpeking#pekinghotelmoscow#pekinghotel#hotelpekingmoscow