Slugify de texto (URL)
Normaliza el texto en un slug amigable para URL, con soporte para minúsculas, separadores y palabras vacías personalizadas.
¿Por qué necesitas Slugify?
🔍 Optimización SEO
Las palabras clave en las URLs ayudan a los motores de búsqueda a entender el contenido de la página, mejorando su clasificación. Por ejemplo, example.com/blog/how-to-learn-javascript es mucho más amigable que example.com/blog/123.
👁️ Legibilidad y compartibilidad
Los usuarios pueden entender el contenido solo con mirar la URL, lo que la hace más amigable para compartir en redes sociales, fácil de recordar y de ingresar manualmente.
💻 Compatibilidad del sistema
Evita errores causados por caracteres especiales en nombres de archivos o URLs, garantiza compatibilidad entre plataformas (Windows/Linux/macOS) y previene problemas de codificación.
🗄️ Amigable para bases de datos
Ideal como identificador único (por ejemplo, nombres de usuario o etiquetas), reduce el riesgo de inyección SQL y facilita el indexado y las consultas.
¿Qué es Slugify?
Un slug es una cadena estandarizada de texto utilizada como URL, nombre de archivo o identificador. Los procesos comunes incluyen normalización de mayúsculas/minúsculas, eliminación de signos de puntuación y unión de palabras con separadores.
- Prioridad ASCII: eliminar acentos y símbolos, conservando solo letras, números y espacios
- Compatibilidad Unicode: normalizar caracteres de la mayoría de los idiomas mediante NFKD antes de procesar
- Amigable para URL: el resultado contiene solo letras, números y separadores, listo para usar directamente en rutas
Preguntas frecuentes
Q: ¿Cómo se manejan los caracteres chinos?
A: Por defecto, se eliminan los acentos y se conservan las letras pinyin. Los caracteres chinos puros pueden convertirse en cadenas vacías; se recomienda convertir manualmente a pinyin antes de aplicar slugify, o usar una herramienta de conversión de pinyin.
Q: ¿Por qué mi resultado está vacío?
A: Es posible que la entrada contenga solo signos de puntuación, símbolos o espacios, o que al activar la eliminación de palabras vacías no queden palabras restantes. Intente desactivar la opción de palabras vacías o ajustar el contenido de entrada.
Q: ¿Debo usar - o _ como separador?
A: Para SEO, se recomienda usar - (guión), ya que Google lo interpreta como un espacio; _ (guión bajo) se considera un conector, lo que dificulta la separación de palabras. Para nombres de archivo, puedes elegir cualquiera de los dos.
Q: ¿Hay un límite de longitud para el slug?
A: Técnicamente no hay límite, pero se recomienda mantenerlo por debajo de 50 caracteres para facilitar la visualización en URLs y mejorar el SEO. Los slugs demasiado largos pueden ser truncados por los motores de búsqueda.
Mejores prácticas
Prácticas recomendadas
- ✓ Manténlo corto (sugerido: < 50 caracteres)
- ✓ Evita caracteres especiales; usa solo letras, números y separadores
- ✓ Convierte a minúsculas para evitar problemas de sensibilidad a mayúsculas/minúsculas
- ✓ Elimina palabras vacías para aumentar la densidad semántica
Prácticas a evitar
- ✗ No incluyas información sensible (como IDs, correos electrónicos o contraseñas)
- ✗ No uses caracteres especiales (como @#$%^&*)
- ✗ No conserves espacios ni separadores consecutivos
- ✗ No repitas la misma palabra
Notas técnicas
Se utiliza NFKD para descomponer y eliminar marcas diacríticas (\p{M}), convirtiendo Café en Cafe. Compatible con la mayoría de los caracteres latinos.
Basada en palabras comunes en inglés (a/an/the/and/or/of/to/in/on/for/at/by/with); puede extenderse personalizadamente. Las palabras vacías en chino requieren procesamiento adicional.
Se requiere soporte para ES6+ y expresiones regulares Unicode (\p{...}). Todos los navegadores modernos (Chrome 64+, Firefox 78+, Safari 11.1+) lo admiten.
¿Cómo generar un Slug mediante un lenguaje de programación?
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("^-+|-+$", "");
}