Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🔥$CAT
Entered this position as a speculative play within the SOLANA ecosystem. Monitor pullbacks carefully, manage entries with discipline, and always conduct your own due diligence before participating. #TSLA
Telegram: https://t.me/theoriginalcatcoin
X: https://x.com/itscatcoin?s=21
Website: https://bitcointalk.org/index.php?topic=441402.msg4849923#msg4849923
🔗 Contract: https://solscan.io/token/4vncMi4j819n9ndBZXwVXaVHPN8oTgebtEPWcaEipump
https://dexscreener.com/solana/Cctnuj42QAx9CXuG2HWxab1tiVrwMkwkgReoLDC9Y3qv
$CAT #SOLANA#TESLACALLS
🔥$RAY
Entered this position as a speculative play within the SOLANA ecosystem. Monitor pullbacks carefully, manage entries with discipline, and always conduct your own due diligence before participating.
X: https://x.com/i/communities/2033099708164378981
Website: https://x.com/bbcworld/status/2033099192877429170?s=46
🔗 Contract: https://solscan.io/token/G7ydggVFm4RVTTsd3E8MWh7angBs78MTmZN3gVZPpump
https://dexscreener.com/solana/HAVxMaLK96qgiyRdvX4YVpjfajU49zWot4tdjxPesMrg
#RAY#SOLANA#TESLACALLS
🔥$PEEP
Pepe is tired of the dips. With $PEEP, he finally found his inner peace. Pepe enjoys the continuous rise and profits that come with this coin. No more red candles, just Endless Pumps.
Telegram: https://t.me/PepeEnjoysEndlessPump
X: https://x.com/i/communities/2033273028843638853
Website: https://pepeenjoysendlesspump.fun/
🔗 Contract: https://solscan.io/token/8HeSKdX9XkJB9PBZiXhFuTYaWbfn3u6sftyPbAcxpump
https://dexscreener.com/solana/3N7BHVKWTvzehC1MxsRcmHRAg9vX6fuZj1JFD2zFPiQk
#PEEP#SOLANA#TESLACALLS
🔥 $BAGWORKOOR
Entered this position as a speculative play within the SOLANA ecosystem. Monitor pullbacks carefully, manage entries with discipline, and always conduct your own due diligence before participating.
X: https://x.com/i/communities/2033254050209153139
🔗 Contract: https://solscan.io/token/FDQ77aHDgV6ozbv1b4WM5oXuHGV1cMnjSXpxvgSzpump
https://dexscreener.com/solana/ED41PwcJhsPgbUHQb4LZJbWzFXtcEC6RAherWC2YgEU3
#BAGWORKOOR#SOLANA#TESLACALLS
🔥$AGENTJAK
An AI-powered Web3 project built around autonomous agents, combining blockchain and intelligent automation to create smarter tools for the crypto ecosystem. 🚀
Telegram: https://t.me/agentwojak
X: https://x.com/agentjak_?s=21
Website: https://agentjak.xyz/
🔗 Contract: https://solscan.io/token/GKyTdLZG7BXjwWUW3QFwz7UykZE9wGXU9bKYDLdbpump
https://dexscreener.com/solana/363sZVoQVmwTbZ5LhCZperw7HJBoTK3dWT8Bqy8rMTqY
#AGENTJAK#SOLANA#TESLACALLS
🔥$GOMU
A meme-powered token inspired by Gomu Gator, bringing fun, viral energy, and a strong community to the Solana ecosystem. Built for memes, momentum, and the next wave of degen culture. 🚀
Telegram: https://t.me/+pTID8PQmyps5ZGRl
X: https://x.com/gomugator?s=21
Website: https://www.gomugator.com/
🔗 Contract: https://solscan.io/token/Bx74hpFiaiBbSonrjyqxjGfAA7gRxM2CeKiy31uN6biR
https://dexscreener.com/solana/2h282gdoEDejWWtXTMfPxvMDVPqKb7rVf24b2gWS1cg4
#GOMU#SOLANA#TESLACALLS
🔥$NOTGAY
A pure meme-driven token built around internet culture and community momentum. Simple narrative, strong meme energy, and a growing degen community pushing the movement forward. 🚀
Telegram: https://t.me/notgaymeme
X: https://x.com/notgaymeme?s=21
Website: https://notgaysool.framer.website/
🔗 Contract: https://solscan.io/token/uphcYhzNzLBQQcQdpsbQXTFSNApMuh1Y4Jp6KTYpump
https://dexscreener.com/solana/Dd4hsmWhwEfkoRh2NxGXmbfYPh474K4yUXuoNmmPYALY
#NOTGAY#SOLANA#TESLACALLS
🔥$MEMECARD
When Solana joined Mastercard's crypto partner program, it signaled crypto entering global payments-but on Solana innovation comes from the internet.
Discord: https://discord.gg/72wPyXsM
X: https://x.com/memecardss?s=21
Website: https://memecard.fun/
🔗 Contract: https://solscan.io/token/ACc3ZBq1c9h7pofwn2J8b8bvRHvqMFwynVg8neLZpump
https://dexscreener.com/solana/CoZ9t3sCeYoNfZwU9kc7fFnpEjcBXptndNwpgbrpqZQR
#MEMECARD#SOLANA#TESLACALLS
🔥$SOS
Strategic Oil Supply ($SOS) is built to represent strength, resilience, and energy independence in the digital economy. Our mission is to create a decentralized reserve that empowers holders and fuels long-term value through a strong global community.
Telegram: https://t.me/sos_portal
X: https://x.com/i/communities/2031245794964344896
Website: https://sos.republican/
🔗 Contract: https://solscan.io/token/DpxKNEi3XVeRByaGqYKvz2w6E2PhPgBAqdayLcQEpump
https://dexscreener.com/solana/BM7Qw7JbGtyLoZw3canKF6Q6EJDp1Q3PYuHQhTNwoq2D
#SOS#SOLANA#TESLACALLS
$ROSIE is showing early momentum. Market activity remains stable with minor consolidation, and the market cap sits at approximately $105K. Initial indicators point to renewed investor interest.
https://dexscreener.com/bsc/0xe8298b28bf4ee4c9c87b8d26d8d2a237f5f54e23
#ROSIE#BSC#TESLACALLS
🔥$FROGS
Rolled the dice on this BSC play dip hunters know the drill: time it right, and always DYOR.
X: https://x.com/christanxsx/status/2019762141427900628?s=46
🔗 Contract: https://solscan.io/token/0xC3B1A6229D9017376cF9a5Ba7a60782BD8dB4444
https://dexscreener.com/bsc/0x3357047F963d6459FB8C4e43c78392e09734e53C
#FROGS#BSC#TESLACALLS
Another day, another planet… we’ll send a picture from there soon 🤭🚀
The $WHITEHOUSE narrative is gaining attention momentum continues to build as the community grows stronger.
CA:
7oXNE1dbpHUp6dn1JF8pRgCtzfCy4P2FuBneWjZHpump
#WHITEHOUSE#SOLANA#TSLA#TESLACALLS🌍🚀