Slug Generator
Преобразуйте любой текст в чистый URL-совместимый slug
Входной текст
Slug
Что такое URL slug?
URL slug — это часть веб-адреса, которая идентифицирует конкретную страницу в удобочитаемом виде. В URL https://example.com/blog/my-first-post слагом является my-first-post. Slug generator преобразует заголовок или описание страницы в строку, содержащую только строчные буквы, цифры и дефисы (или другой выбранный разделитель). Этот процесс удаляет пробелы, убирает акценты и диакритические знаки, отбрасывает спецсимволы и нормализует пробельные символы в одиночные разделители.
Генерация slug — стандартный шаг в системах управления контентом, генераторах статических сайтов, блог-платформах и любых приложениях, которые формируют URL из пользовательского ввода. WordPress, Ghost, Hugo, Next.js и Django содержат логику генерации slug, поскольку читаемые URL улучшают удобство использования и поисковую оптимизацию. Правильно сформированный slug сообщает пользователю содержимое страницы ещё до перехода по ссылке.
Термин «slug» пришёл из газетного дела, где так называли краткую метку для идентификации материала в процессе производства. В веб-разработке slug выполняет ту же функцию: это компактный, уникальный, URL-безопасный идентификатор, производный от более длинного заголовка или названия. Поскольку slug формируются программно, надёжный slug generator обеспечивает единообразие для каждой страницы и каждой локали.
Зачем использовать этот Slug Generator?
Создание URL slug вручную чревато ошибками. Забытый акцент, двойной дефис или необработанный граничный случай с Unicode-вводом способны породить нерабочие или некрасивые URL. Этот инструмент решает перечисленные проблемы автоматически.
Сценарии использования Slug Generator
Правила генерации slug и обработка символов
Генерация slug следует предсказуемой последовательности преобразований. Понимание каждого шага поможет отладить неожиданный результат или создать собственную функцию slugify.
- 1. Нормализация Unicode (NFD)Разложите составные символы на базовый символ и комбинирующий знак. Например, é (U+00E9) становится e + комбинирующее острое ударение (U+0301). Это делает диакритические знаки удаляемыми на следующем шаге.
- 2. Удаление диакритических знаковУдалите все символы блока Unicode Combining Diacritical Marks (U+0300–U+036F). После этого шага café становится cafe, а Ñ становится N.
- 3. Удаление спецсимволовЗамените любой символ, не являющийся буквой, цифрой, пробельным символом или дефисом, на пробел. Это убирает знаки пунктуации, символы и знаки, не имеющие ASCII-эквивалента.
- 4. Обрезка и схлопывание пробеловУдалите ведущие и завершающие пробелы, затем схлопните все последовательности идущих подряд пробелов, подчёркиваний или дефисов в один выбранный разделитель.
- 5. Применение регистра и разделителяПриведите к нижнему регистру (опционально) и соедините слова выбранным символом-разделителем: дефисом (-), подчёркиванием (_) или точкой (.).
Справочник преобразований символов
Таблица ниже показывает, как обрабатываются распространённые символы в процессе генерации slug:
| Входной символ | Результат | Применённое правило |
|---|---|---|
| Hello World | hello-world | Lowercase + space → hyphen |
| Café au Lait | cafe-au-lait | NFD normalization strips é → e |
| naïve résumé | naive-resume | Multiple diacritics removed |
| Price: $9.99! | price-9-99 | Symbols ($, !, :) removed |
| too many | too-many | Whitespace trimmed and collapsed |
| one--two___three | one-two-three | Mixed separators collapsed |
| Привет мир | privet-mir | Cyrillic (if transliteration) or removed |
| file_name.txt | file-name-txt | Dots and underscores replaced |
| React & Vue | react-vue | Ampersand removed |
| 2026-03-30 | 2026-03-30 | Digits and hyphens preserved |
Примеры кода
Генерация slug на популярных языках и фреймворках. Каждый пример обрабатывает нормализацию Unicode, удаление диакритических знаков и вставку разделителя.
function slugify(text, separator = '-') {
return text
.normalize('NFD') // decompose accented chars
.replace(/[\u0300-\u036f]/g, '') // strip diacritics
.toLowerCase()
.replace(/[^\w\s-]/g, ' ') // drop special chars
.trim()
.replace(/[\s_-]+/g, separator) // collapse whitespace → separator
// slugify('Café au Lait') → "cafe-au-lait"
// slugify('Hello World', '_') → "hello_world"
}
// Node.js alternative using the `slugify` npm package:
// npm install slugify
// const slugify = require('slugify')
// slugify('Hello World', { lower: true, strict: true }) → "hello-world"import re
import unicodedata
def slugify(text: str, separator: str = '-') -> str:
"""Convert text to a URL-safe slug."""
text = unicodedata.normalize('NFD', text)
text = text.encode('ascii', 'ignore').decode('ascii') # strip non-ASCII
text = text.lower()
text = re.sub(r'[^\w\s-]', ' ', text)
text = text.strip()
text = re.sub(r'[\s_-]+', separator, text)
return text
# slugify('Café au Lait') → "cafe-au-lait"
# slugify('Hello World', '_') → "hello_world"
# Alternative: python-slugify (pip install python-slugify)
# from slugify import slugify
# slugify('Café au Lait') → "cafe-au-lait"package main
import (
"regexp"
"strings"
"unicode"
"golang.org/x/text/unicode/norm"
"golang.org/x/text/transform"
"golang.org/x/text/runes"
)
func slugify(text string) string {
// NFD normalize and strip diacritics
t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
result, _, _ := transform.String(t, text)
result = strings.ToLower(result)
re := regexp.MustCompile(`[^\w\s-]+`)
result = re.ReplaceAllString(result, " ")
result = strings.TrimSpace(result)
re = regexp.MustCompile(`[\s_-]+`)
result = re.ReplaceAllString(result, "-")
return result
}
// slugify("Café au Lait") → "cafe-au-lait"
// slugify("Hello World") → "hello-world"function slugify(string $text, string $separator = '-'): string {
// Transliterate non-ASCII characters
$text = transliterator_transliterate(
'Any-Latin; Latin-ASCII; Lower()', $text
);
// Remove anything that is not a word char, space, or hyphen
$text = preg_replace('/[^\w\s-]/', ' ', $text);
$text = trim($text);
$text = preg_replace('/[\s_-]+/', $separator, $text);
return $text;
}
// slugify('Café au Lait') → "cafe-au-lait"
// slugify('Hello World', '_') → "hello_world"