Gerador de Slug
Converta qualquer texto em um slug limpo e amigável para URLs
Texto de entrada
Slug
O Que É um Slug de URL?
Um slug de URL é a parte de um endereço web que identifica uma página específica de forma legível para humanos. Na URL https://example.com/blog/meu-primeiro-post, o slug é meu-primeiro-post. Um gerador de slug transforma o título ou a descrição de uma página em uma string que contém apenas letras minúsculas, números e hifens (ou outro separador escolhido). Esse processo remove espaços, elimina acentos e diacríticos, descarta caracteres especiais e normaliza os espaços em branco em separadores únicos.
A geração de slugs é uma etapa padrão em sistemas de gerenciamento de conteúdo, geradores de sites estáticos, plataformas de blog e qualquer aplicação que derive URLs da entrada do usuário. WordPress, Ghost, Hugo, Next.js e Django incluem lógica de geração de slug porque URLs legíveis melhoram tanto a usabilidade quanto a otimização para motores de busca. Um slug bem formado informa ao usuário o que uma página contém antes mesmo de clicar no link.
O termo "slug" vem do jornalismo impresso, onde se referia a um rótulo curto usado para identificar uma matéria durante a produção. No desenvolvimento web, o slug desempenha a mesma função: é um identificador compacto, único e seguro para URL, derivado de um título ou nome mais longo. Como os slugs são gerados programaticamente, um gerador confiável garante consistência em todas as páginas e localidades.
Por Que Usar Este Gerador de Slug?
Criar slugs de URL manualmente é propenso a erros. Esquecer de remover um acento, deixar um hífen duplo ou não tratar um caso especial com entrada Unicode pode produzir URLs quebradas ou feias. Esta ferramenta resolve esses problemas automaticamente.
Casos de Uso do Gerador de Slug
Regras de Geração de Slug e Tratamento de Caracteres
A geração de slugs segue uma sequência previsível de transformações. Entender cada etapa ajuda a depurar saídas inesperadas ou criar sua própria função slugify.
- 1. Normalização Unicode (NFD)Decompõe caracteres combinados em caractere base + marca de combinação. Por exemplo, é (U+00E9) se torna e + acento agudo combinado (U+0301). Isso torna os diacríticos removíveis na próxima etapa.
- 2. Remoção de DiacríticosRemove todos os caracteres no bloco Unicode de Marcas Diacríticas Combinadas (U+0300–U+036F). Após esta etapa, café se torna cafe e Ñ se torna N.
- 3. Remoção de Caracteres EspeciaisSubstitui qualquer caractere que não seja letra, dígito, espaço em branco ou hífen por um espaço. Isso elimina pontuação, símbolos e caracteres sem equivalente ASCII.
- 4. Redução de Espaços em BrancoRemove espaços em branco no início e no fim, depois colapsa todas as sequências consecutivas de espaços, sublinhados ou hifens em um único separador escolhido.
- 5. Aplicar Capitalização e SeparadorConverte para minúsculas (opcional) e une as palavras com o separador escolhido: hífen (-), sublinhado (_) ou ponto (.).
Referência de Transformação de Caracteres
A tabela abaixo mostra como os caracteres mais comuns são tratados durante a geração do slug:
| Entrada | Saída | Regra Aplicada |
|---|---|---|
| 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 |
Exemplos de Código
Geração de slugs em linguagens e frameworks populares. Cada exemplo trata normalização Unicode, remoção de diacríticos e inserção de separadores.
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"