Разработка на PHP: Как создать уникальный слаг (slug) для URL из заголовка статьи на кириллице?

Создание уникального слага (slug) для URL из заголовка статьи на кириллице — одна из типичных задач при разработке CMS, блогов и новостных сайтов на PHP. Рассмотрим полный процесс пошагово.

## Шаг 1: Транслитерация кириллицы в латиницу

Первым делом необходимо преобразовать кириллические символы в их латинские эквиваленты. Для этого используют таблицу транслитерации:

php
function transliterate(string $text): string {
$table = [
‘а’=>’a’,’б’=>’b’,’в’=>’v’,’г’=>’g’,’д’=>’d’,
‘е’=>’e’,’ё’=>’yo’,’ж’=>’zh’,’з’=>’z’,’и’=>’i’,
‘й’=>’j’,’к’=>’k’,’л’=>’l’,’м’=>’m’,’н’=>’n’,
‘о’=>’o’,’п’=>’p’,’р’=>’r’,’с’=>’s’,’т’=>’t’,
‘у’=>’u’,’ф’=>’f’,’х’=>’kh’,’ц’=>’ts’,’ч’=>’ch’,
‘ш’=>’sh’,’щ’=>’sch’,’ъ’=>»,’ы’=>’y’,’ь’=>»,
‘э’=>’e’,’ю’=>’yu’,’я’=>’ya’,
];
$text = mb_strtolower($text, ‘UTF-8’);
return strtr($text, $table);
}

## Шаг 2: Очистка и форматирование строки

После транслитерации необходимо убрать все символы, кроме букв, цифр и дефисов, а также заменить пробелы на дефисы:

php
function makeSlug(string $title): string {
$slug = transliterate($title);
$slug = preg_replace(‘/[^a-z0-9s-]/u’, », $slug);
$slug = preg_replace(‘/[s-]+/’, ‘-‘, $slug);
$slug = trim($slug, ‘-‘);
return $slug;
}

## Шаг 3: Обеспечение уникальности слага

Если слаг уже существует в базе данных, необходимо добавить числовой суффикс:

php
function generateUniqueSlug(PDO $pdo, string $title): string {
$baseSlug = makeSlug($title);
$slug = $baseSlug;
$counter = 1;

while (true) {
$stmt = $pdo->prepare(‘SELECT COUNT(*) FROM articles WHERE slug = :slug’);
$stmt->execute([‘:slug’ => $slug]);
if ($stmt->fetchColumn() == 0) {
break;
}
$slug = $baseSlug . ‘-‘ . $counter;
$counter++;
}

return $slug;
}

## Альтернатива: использование готовых библиотек

Для продакшн-проектов рекомендуется использовать библиотеку **cocur/slugify**, которая поддерживает множество языков, включая русский:

bash
composer require cocur/slugify

php
use CocurSlugifySlugify;

$slugify = new Slugify();
$slug = $slugify->slugify(‘Привет мир’);
// Результат: privet-mir

## Важные рекомендации

— **Длина слага**: ограничивайте слаг до 100–200 символов для корректного хранения в БД.
— **Индексирование**: добавьте уникальный индекс на поле `slug` в таблице.
— **Кэширование**: при высокой нагрузке кэшируйте результаты проверки уникальности.
— **Обновление**: при изменении заголовка статьи не обновляйте слаг автоматически — это сломает существующие ссылки.

Таким образом, грамотная реализация генерации слагов обеспечивает SEO-friendly URL и стабильную работу системы маршрутизации.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.