🔗URL & UTM
Generate SEO-Friendly URL Slugs
Convert titles to clean, SEO-friendly URL slugs
Explanation
Transform text into URL-safe slugs: lowercase, hyphens, no special chars.
Examples
Simple title
Input
How to Build a Website
Output
how-to-build-a-website
With special chars
Input
Top 10 JavaScript Tips & Tricks!
Output
top-10-javascript-tips-tricks
With accents
Input
Café Münchën
Output
cafe-munchen
Code Examples
JavaScript
function generateSlug(text) {
return text
.toLowerCase() // Convert to lowercase
.normalize('NFD') // Normalize accents
.replace(/[\u0300-\u036f]/g, '') // Remove diacritics
.replace(/[^a-z0-9\s-]/g, '') // Remove special chars
.trim() // Trim whitespace
.replace(/\s+/g, '-') // Replace spaces with hyphens
.replace(/-+/g, '-'); // Remove consecutive hyphens
}
// Advanced version with transliteration
function generateSlugAdvanced(text, maxLength = 60) {
// Custom transliteration map
const transliterate = str => {
const map = {
'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'ß': 'ss',
'æ': 'ae', 'ø': 'oe', 'å': 'aa'
};
return str.replace(/[äöüßæøå]/g, char => map[char] || char);
};
let slug = text
.toLowerCase()
.trim();
// Transliterate
slug = transliterate(slug);
// Normalize and remove accents
slug = slug
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
// Remove special chars and clean up
slug = slug
.replace(/[^a-z0-9\s-]/g, '')
.replace(/\s+/g, '-')
.replace(/-+/g, '-')
.replace(/^-+|-+$/g, '');
// Truncate to max length
if (slug.length > maxLength) {
slug = slug.substring(0, maxLength).replace(/-[^-]*$/, '');
}
return slug;
}
// Usage
console.log(generateSlug('Hello World!'));
// 'hello-world'
console.log(generateSlug('Top 10 JavaScript Tips & Tricks!'));
// 'top-10-javascript-tips-tricks'
console.log(generateSlugAdvanced('Café in München: Best Places 2024'));
// 'cafe-in-muenchen-best-places-2024' Python
import re
import unicodedata
def generate_slug(text, max_length=60):
# Normalize unicode characters
text = unicodedata.normalize('NFKD', text)
text = text.encode('ascii', 'ignore').decode('ascii')
# Convert to lowercase
text = text.lower()
# Remove special characters
text = re.sub(r'[^a-z0-9\s-]', '', text)
# Replace spaces with hyphens
text = re.sub(r'\s+', '-', text)
# Remove consecutive hyphens
text = re.sub(r'-+', '-', text)
# Trim hyphens from start and end
text = text.strip('-')
# Truncate to max length
if len(text) > max_length:
text = text[:max_length].rsplit('-', 1)[0]
return text
# Usage
print(generate_slug('Hello World!'))
# 'hello-world'Try it Now
💡 Tips
- Always lowercase for consistency
- Use hyphens, not underscores
- Remove or transliterate special characters
- Keep slugs under 60 characters
- Make slugs descriptive for SEO
- Check for uniqueness in database
- Consider adding ID suffix for guaranteed uniqueness
⚠️ Common Pitfalls
- Empty slugs after removing special chars
- Very long titles create unwieldy slugs
- Duplicate slugs need handling
- Emoji and unicode need careful handling
- Some languages don't transliterate well