Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
#Apple
Apple Store 上线国家补贴,仅限北京上海
🔗Apple Store (中国大陆)
Apple Store 官方在中国大陆上线了国家补贴,购买 iPhone、iPad 或指定配置 Apple Watch 最高优惠 RMB 500。商品总价须低于 RMB 6000。购买符合条件的 Mac 机型最高优惠 RMB 2000。升级配置不可享受补贴优惠。仅限 Apple Store 在线商店 (北京收货地址) 和 Apple Store 零售店 (上海地区)。
常见问题
符合资格的消费者购买参与活动的 iPhone、iPad、Apple Watch 时,可享商品到手价基础上再立减 15% 的国家补贴,每件补贴不超过 500 元,仅限到手价不超过 6000 元的单件商品;购买参与活动的 Mac 时,可享商品到手价基础上再立减 20% 的国家补贴,每件补贴不超过 2000 元。如该产品同时参与 Apple 或其合作伙伴提供的其他优惠活动,优惠额度部分不计算国家补贴。实际补贴金额以商品购买页面展示为准。
符合资格的消费者每类产品仅可享补贴 1 件。
参与国家补贴的订单仅可包含 1 件参与活动的商品。若订单包含多个商品,则该订单中的所有商品均无法享受国家补贴。
参与国家补贴的订单不支持与 iPhone 年年焕新计划、Apple Trade In 换购计划或 AppleCare+ 服务计划同时下单购买。
参与国家补贴的订单不支持保价退差。
Apple Store 在线商店:参与国家补贴的 Apple Store 在线商店订单不支持 Apple Store 零售店取货服务、快送服务,不支持定制化服务、镌刻服务。按照政府的相关规定,参与国家补贴的 Apple Store 在线商店订单对签收时间有特殊要求。消费者须在下单之日起 6 天内完成签收,否则订单将被取消,商品由承运商取回。在承运商经尝试送货,消费者无法签收的情况下,订单可能会被取消。商品发货日期超过一定期限的非现货商品可能无法享受国家补贴。请在商品购买页面确认是否具备补贴活动参与资格。参与国家补贴的 Apple Store 在线商店订单不支持部分退款,不支持收货地址更改,不支持换货。参与国家补贴的 Apple Store 在线商店订单需在签收快递时配合承运商完成现场拆封、激活及拍照存档等国家补贴政策所要求的操作。如无法在签收当场完成激活或配合拍照存档等操作,订单将被取消,商品由承运商取回。
Apple Store 零售店:于上海地区 Apple Store 零售店参与活动的消费者,在享受国家补贴时,必须出示身份证件,提供姓名,用以按要求开具个人实名信息的发票。参与国家补贴的 Apple Store 零售店订单不支持部分退款,不支持换货,不支持部分付款方式,不支持定制化服务。参与国家补贴的 Apple Store 零售店订单,购买后需在门店配合工作人员完成现场拆封、激活及拍照存档等国家补贴政策所要求的操作。如不能在购买当场完成激活或配合拍照存档等操作,则无法享受国家补贴。
本次活动仅针对个人消费者。参与国家补贴的订单仅支持开具个人的增值税普通发票 (如需发票抬头,仅可开具消费者本人实名信息),不支持变更抬头,不支持企业抬头。
#Promotions#AppleStore
📮 频道 @AppPie