🔗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