WikiPlus

Convertir Texto a Slug Automáticamente: Funciones en JavaScript, Python y PHP

Si eres desarrollador y necesitas generar slugs automáticamente en tu aplicación sin depender de herramientas externas, las funciones de transliteración y sanitización de texto son imprescindibles. Esta guía proporciona implementaciones listas para usar en los tres lenguajes de backend más comunes (JavaScript/Node.js, Python y PHP), con soporte completo para caracteres especiales de idiomas europeos incluyendo el español, francés, alemán y otros.

Función para generar slugs en JavaScript/Node.js

En proyectos JavaScript y Node.js, puedes usar la API nativa `String.prototype.normalize` para manejar los acentos sin necesidad de librerías externas: ```javascript function generateSlug(text) { return text .toString() .toLowerCase() // Normaliza a forma NFD y elimina diacríticos (acentos, diéresis) .normalize('NFD') .replace(/[\u0300-\u036f]/g, '') // Trata casos especiales que NFD no maneja bien .replace(/ñ/g, 'n') .replace(/ß/g, 'ss') .replace(/æ/g, 'ae') .replace(/œ/g, 'oe') // Convierte espacios y caracteres especiales en guiones .replace(/[^a-z0-9\s-]/g, '') .replace(/[\s_-]+/g, '-') // Elimina guiones al inicio y final .trim() .replace(/^-+|-+$/g, ''); } // Ejemplos: console.log(generateSlug('Cómo Crear un Código QR')); // → 'como-crear-un-codigo-qr' console.log(generateSlug('Ñoño y Señal de Año')); // → 'nono-y-senal-de-ano' console.log(generateSlug('Müller & Özdemir GmbH')); // → 'muller-ozdemir-gmbh' ``` Alternativamente, la librería npm `slugify` ofrece soporte más completo para caracteres de idiomas no europeos: `npm install slugify`. Configuración recomendada: `slugify(text, { lower: true, strict: true, locale: 'es' })`.

Función para generar slugs en Python

En Python, el módulo `unicodedata` de la librería estándar permite normalizar caracteres Unicode sin dependencias externas: ```python import unicodedata import re def generate_slug(text: str) -> str: # Convierte a minúsculas text = text.lower() # Casos especiales antes de la normalización replacements = { 'ñ': 'n', 'ß': 'ss', 'æ': 'ae', 'œ': 'oe', 'ä': 'ae', 'ö': 'oe', 'ü': 'ue' # transliteraciones alemanas } for char, replacement in replacements.items(): text = text.replace(char, replacement) # Normaliza a NFD y elimina diacríticos text = unicodedata.normalize('NFD', text) text = ''.join(c for c in text if unicodedata.category(c) != 'Mn') # Elimina caracteres no alfanuméricos (excepto guiones y espacios) text = re.sub(r'[^a-z0-9\s-]', '', text) # Reemplaza espacios y múltiples guiones por un solo guión text = re.sub(r'[\s_-]+', '-', text).strip('-') return text # Ejemplos: print(generate_slug('Cómo Crear un Código QR con Logo')) # → 'como-crear-un-codigo-qr-con-logo' print(generate_slug('Über die Größe von Müller')) # → 'ueber-die-groesse-von-mueller' ``` Para proyectos Django, existe el helper `django.utils.text.slugify` que hace gran parte de este trabajo, aunque maneja peor algunos caracteres específicos como la ñ española.

Función para generar slugs en PHP

En PHP, la función `iconv` con la transliteración `ASCII//TRANSLIT` es la forma más robusta de manejar caracteres internacionales: ```php function generateSlug(string $text): string { // Establece el locale para el contexto de transliteración setlocale(LC_ALL, 'es_ES.UTF-8'); // Convierte a minúsculas primero $text = mb_strtolower($text, 'UTF-8'); // Casos especiales de transliteración $specialChars = [ 'ñ' => 'n', 'ß' => 'ss', 'æ' => 'ae', 'œ' => 'oe' ]; $text = str_replace( array_keys($specialChars), array_values($specialChars), $text ); // Transliteración de caracteres Unicode a ASCII $text = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $text); // Elimina caracteres no válidos $text = preg_replace('/[^a-z0-9\s-]/', '', $text); // Reemplaza espacios y múltiples guiones $text = preg_replace('/[\s_-]+/', '-', $text); return trim($text, '-'); } // Uso: echo generateSlug('Generador de Meta Tags SEO'); // → 'generador-de-meta-tags-seo' ``` En WordPress, la función nativa `sanitize_title()` hace este trabajo automáticamente para los slugs de posts. En Laravel, el helper `Str::slug($text, '-', 'es')` gestiona la generación de slugs con soporte de locale.

Librerías y herramientas recomendadas para generación automática de slugs

Para proyectos de mayor escala o con necesidades de múltiples idiomas (incluyendo caracteres no latinos como árabe, chino o ruso), las librerías especializadas ofrecen mejor cobertura que las implementaciones manuales. **JavaScript/Node.js:** - `slugify` (GitHub: simov/slugify): la más popular, soporta 200+ idiomas con configuración de locale - `@sindresorhus/slugify`: más moderna, con soporte de caracteres Unicode completo - `limax`: añade soporte para idiomas con caracteres no latinos (árabe, chino, hebreo) **Python:** - `python-slugify` (PyPI): la librería más completa, con soporte para transliteración de prácticamente todos los alfabetos del mundo. `pip install python-slugify` - `awesome-slugify`: más configurable, permite definir reglas de transliteración personalizadas **PHP:** - `cocur/slugify` (Composer): la más utilizada en proyectos PHP modernos. `composer require cocur/slugify` - `laravelista/ekko`: helper específico para Laravel **Casos de uso avanzados:** si necesitas generar slugs para contenido en árabe, chino, japonés o ruso, la transliteración simple no es suficiente: necesitas una librería de romanización/pinyin específica para cada alfabeto. `limax` (JS) y `python-slugify` con `unidecode` como backend son las opciones más completas para proyectos verdaderamente multilingüe.

Preguntas frecuentes

¿Hay alguna diferencia entre usar guiones (-) o guiones bajos (_) en el código que genera los slugs?
Para SEO, usa siempre guiones. Para código interno (nombres de variables, identificadores de base de datos), puedes usar guiones bajos porque no se exponen en URLs. La función generateSlug debe siempre producir slugs con guiones, independientemente de los separadores que uses internamente en tu código.
¿La función necesita eliminar las stop words para que los slugs sean mejores para SEO?
Es opcional y depende del caso. Para artículos de blog, eliminar artículos y preposiciones ('el', 'la', 'de', 'para') puede hacer los slugs más cortos y directos. Para nombres propios, empresas o títulos específicos, mantener todas las palabras puede ser más preciso. Muchos generadores ofrecen esto como opción configurable.
¿Cómo gestiono colisiones de slug si dos páginas generan el mismo slug automáticamente?
La solución estándar es verificar si el slug ya existe en la base de datos y añadir un sufijo incremental si hay conflicto: `mi-articulo`, `mi-articulo-2`, `mi-articulo-3`. WordPress lo hace automáticamente. En proyectos personalizados, implementa esta verificación en la función de guardado de contenido.