Текст Slugify (URL)

Нормалізуйте текст у URL-дружній slug, підтримує нижній регістр, роздільники, власні стоп-слова.

Параметри та введення

Рекомендується використовувати - або _, довжина 1–3 символи

Результат

Чому потрібен Slugify?

🔍 Оптимізація для SEO

Ключові слова в URL допомагають пошуковим системам розуміти вміст сторінки та покращують її позиції. Наприклад, example.com/blog/how-to-learn-javascript значно краще, ніж example.com/blog/123.

👁️ Читабельність та обмін

Користувачі зразу розуміють вміст за URL — це зручно для обміну в соцмережах, легше запам'ятовувати та вводити вручну.

💻 Сумісність з системами

Уникніть помилок через спеціальні символи в іменах файлів чи URL — гарантія сумісності між платформами (Windows, Linux, macOS) та уникнення проблем з кодуванням.

🗄️ Дружній до баз даних

Використовуйте як унікальний ідентифікатор (наприклад, ім'я користувача, теги) — уникайте ризиків SQL-ін'єкцій, полегшуйте індексацію та запити.

Що таке Slugify?

Slug — це нормалізована версія тексту, призначена для використання як URL, ім'я файлу чи ідентифікатор. Звичайні операції: приведення до одного регістру, видалення пунктуації, з'єднання слів за допомогою роздільників.

  • Пріоритет ASCII: максимально видаляйте акценти та символи, залишаючи лише літери, цифри та пробіли
  • Сумісність Unicode: нормалізація NFKD для більшості символів різних мов
  • URL-дружній: результат містить лише літери, цифри та роздільники — готовий до використання в шляхах

Сценарії використання

URL статей у блозі

Як вивчати JavaScript?

how-to-learn-javascript

Назва файлу

Документ з вимогами до продукту v2.0.docx

product-requirements-v2-0.docx

Ідентифікатор бази даних

Користувач-Захар

user-zahar

Часті питання

Q: Як обробляються китайські символи?

A: За замовчуванням акценти видаляються, залишаються латинські літери пінінь. Чистий китайський текст може стати порожнім. Рекомендується спочатку вручну перетворити на пінінь, а потім застосувати slugify, або скористатися інструментом для перетворення китайської мови на пінінь.

Q: Чому мій результат порожній?

A: Можливо, вхідні дані складаються лише з розділових знаків/символів/пробілів, або після фільтрації стоп-слів не залишилося жодного слова. Спробуйте вимкнути опцію фільтрації стоп-слів або змінити вхідний текст.

Q: Який роздільник краще використовувати — - чи _?

A: Для SEO рекомендується використовувати - (дефіс), оскільки Google сприймає його як пробіл. _ (підкреслення) сприймається як з’єднувальний символ, що погіршує розбиття на слова. Для імен файлів можна вибирати будь-який.

Q: Чи є обмеження на довжину slug?

A: Технічно обмежень немає, але рекомендується триматися в межах 50 символів для зручного відображення URL та SEO. Дуже довгі slug можуть бути обрізані пошуковими системами.

Найкращі практики

Рекомендовані дії

  • Зберігайте короткі (рекомендується < 50 символів)
  • Уникайте спеціальних символів, використовуйте лише літери, цифри та роздільники
  • Використовуйте нижній регістр, щоб уникнути проблем з чутливістю до регістру
  • Видаляйте стоп-слова для збільшення семантичної щільності

Що уникати

  • Не включайте конфіденційну інформацію (наприклад, ID, електронну пошту, паролі)
  • Не використовуйте спеціальні символи (наприклад, @#$%^&*)
  • Не залишайте пробіли або кілька роздільників поспіль
  • Не дублюйте однакові слова

Технічні деталі

Нормалізація Unicode:

Використовується NFKD-розклад + видалення комбінованих діакритичних знаків (\p{M}), наприклад, Café → Cafe. Підтримує більшість латинських символів.

Список стоп-слів:

На основі поширених англійських слів (a/an/the/and/or/of/to/in/on/for/at/by/with). Можна розширювати. Для китайських стоп-слів потрібна додаткова обробка.

Сумісність із браузерами:

Потрібна підтримка ES6+ та Unicode-регулярних виразів (\p{...}). Сучасні браузери (Chrome 64+, Firefox 78+, Safari 11.1+) підтримують це.

Як створити Slug за допомогою мови програмування?

JavaScript

function slugify(text) {
  return text
    .toLowerCase()
    .normalize("NFKD")
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/[^\w\s-]/g, "")
    .trim()
    .replace(/[\s_-]+/g, "-")
    .replace(/^-+|-+$/g, "");
}

PHP

function slugify($text) {
  $text = mb_strtolower($text);
  $text = iconv("UTF-8", "ASCII//TRANSLIT", $text);
  $text = preg_replace("/[^\w\s-]/", "", $text);
  $text = preg_replace("/[\s_-]+/", "-", $text);
  return trim($text, "-");
}

Python

import re
import unicodedata

def slugify(text):
    text = text.lower()
    text = unicodedata.normalize("NFKD", text)
    text = text.encode("ascii", "ignore").decode("ascii")
    text = re.sub(r"[^\w\s-]", "", text)
    text = re.sub(r"[\s_-]+", "-", text)
    return text.strip("-")

Go

import (
    "regexp"
    "strings"
    "golang.org/x/text/unicode/norm"
)

func Slugify(text string) string {
    text = strings.ToLower(text)
    text = norm.NFKD.String(text)
    re := regexp.MustCompile(`[^\w\s-]`)
    text = re.ReplaceAllString(text, "")
    re = regexp.MustCompile(`[\s_-]+`)
    text = re.ReplaceAllString(text, "-")
    return strings.Trim(text, "-")
}

Ruby

require "unicode"

def slugify(text)
  text = text.downcase
  text = Unicode.nfkd(text).gsub(/[^\x00-\x7F]/, "")
  text = text.gsub(/[^\w\s-]/, "")
  text = text.gsub(/[\s_-]+/, "-")
  text.strip.gsub(/^-+|-+$/, "")
end

Java

import java.text.Normalizer;

public static String slugify(String text) {
    text = text.toLowerCase();
    text = Normalizer.normalize(text, Normalizer.Form.NFKD);
    text = text.replaceAll("[^\\w\\s-]", "");
    text = text.replaceAll("[\\s_-]+", "-");
    return text.replaceAll("^-+|-+$", "");
}