Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
📱 HTC Ray-Ban Meta ko‘zoynaklariga raqobatchi mahsulotini taqdim etdi — HTC VIVE Eagle
ℹ️ HTC ko‘zoynaklari nafaqat video yozadi, balki Gemini yordamchisi (keyinchalik ChatGPT qo‘shiladi) orqali so‘rovlarni bajaradi, matnni 13 xil tilga tarjima qiladi, qo‘ng‘iroqlarga javob beradi va musiqa ijro etadi.
⚙️ Texnik xususiyatlari: 12 megapikselli kamera, 4 ta mikrofon, dasta qismida stereodinamiklar, Snapdragon AR1 Gen 1 protsessori, 4 GB tezkor va 32 GB doimiy xotira. Og‘irligi — 49 gramm.
📷 Foto o‘lchami — 3024×4032, video esa 1512×2016 va faqat 30 kadr/soniyada. Surat va videolar faqat 4:3 formatida bo‘ladi.
🔋235 mA·so‘l ichki akkumulyator 4 soat musiqa yoki 3 soat qo‘ng‘iroq qilish imkonini beradi. Video yozish vaqti ko‘rsatilmagan.
👓 To‘rt xil rangda taqdim etiladi. Narxi — taxminan $520. To‘plamga Zeiss quyoshdan himoya linzalari ham kiradi.
➡️#htc | Birinchi raqamli IT-Blog
时代的眼泪:“HTC 天气应用”关停,附属小工具无法工作
HTC官方宣布,旗下“HTC天气应用”已于2025年12月18日关停,该应用及其附属小工具将无法再运行。HTC天气应用是HTC SENSE UI系统中内置的天气应用,该应用曾于2014年11月上架谷歌Play商店,开放给其他安卓用户使用,用户可查看世界各地7-12天天气预报及湿度、体感温度等信息
用过的路过…
标签:#htc
Created by RocM
官方频道:@rocCHL
官方群组:@roctech
官方合作:@rocmmbot
🩸🩸🩸
👓HTC unveiled its new Vive Focus Vision VR headset. It is an XR headset with 5K resolution, eye tracking, and automatic interpupillary distance adjustment. The price is $1000, $400 more than the flagship version of Quest 3.
The headset has 12 GB of RAM and supports microSD memory cards. It aims to attract gamers and professionals in the corporate sector, including medicine and industry.
#HTC#AI
MARKHEMIST
Продолжаю рассказывать про те гаджеты, которые когда-либо оказались в Книге Рекордов Гиннесса 🏆
Вчера я рассказывал вам как в Книге Рекордов оказалась Sony, собрав огромную мозаику из своих смартфонов одной модели - Xperia ZL.
Следом им ответила HTC, уже из 400 моделей HTC One они собрали свою мозаику и тоже оказались на страницах Книги Рекордов Гиннесса.
Свою догадку про HTC One вчера, кстати, в комментарии написал наш подписчик Pablo Eskobar, и оказался совершенно прав.
Завтра расскажу про одну неубивайку, которая тоже попала на страницы Книги Рекордов Гиннесса)
Ваши догадки, это.. ?
#HTC
#телефоны_рекордсмены
Продолжаю рассказывать про лончеры производителей мобилок и сегодня про HTC
Sense - это UI, разработанный компанией HTC для своих андроид-смартфонов.
Официально считается что Sense существовал со времён коммуникаторов HTC на WM. Однако, стоит заметить, что тогда он был реализован лишь в качестве плагина экрана "Сегодня", и не имел ничего общего с Sense на Android.
Первым андроид-смартфоном с оболочкой Sense был HTC Hero, представленный в 2009 году. Работал смартфон на Android 1.5 Cupcake.
Кстати, это был первый андроид-смарт, который официально поставлялся в Россию.
#HTC
#Sense
#Android