Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java code/library for generating slugs (for use in pretty URLs)

Web frameworks such as Rails and Django has built-in support for "slugs" which are used to generate readable and SEO-friendly URLs:

  • Slugs in Rails
  • Slugs in Django

A slug string typically contains only of the characters a-z, 0-9 and - and can hence be written without URL-escaping (think "foo%20bar").

I'm looking for a Java slug function that given any valid Unicode string will return a slug representation (a-z, 0-9 and -).

A trivial slug function would be something along the lines of:

return input.toLowerCase().replaceAll("[^a-z0-9-]", ""); 

However, this implementation would not handle internationalization and accents (ë > e). One way around this would be to enumerate all special cases, but that would not be very elegant. I'm looking for something more well thought out and general.

My question:

  • What is the most general/practical way to generate Django/Rails type slugs in Java?
like image 750
knorv Avatar asked Nov 01 '09 13:11

knorv


2 Answers

Normalize your string using canonical decomposition:

  private static final Pattern NONLATIN = Pattern.compile("[^\\w-]");   private static final Pattern WHITESPACE = Pattern.compile("[\\s]");    public static String toSlug(String input) {     String nowhitespace = WHITESPACE.matcher(input).replaceAll("-");     String normalized = Normalizer.normalize(nowhitespace, Form.NFD);     String slug = NONLATIN.matcher(normalized).replaceAll("");     return slug.toLowerCase(Locale.ENGLISH);   } 

This is still a fairly naive process, though. It isn't going to do anything for s-sharp (ß - used in German), or any non-Latin-based alphabet (Greek, Cyrillic, CJK, etc).

Be careful when changing the case of a string. Upper and lower case forms are dependent on alphabets. In Turkish, the capitalization of U+0069 (i) is U+0130 (İ), not U+0049 (I) so you risk introducing a non-latin1 character back into your string if you use String.toLowerCase() under a Turkish locale.

like image 153
McDowell Avatar answered Sep 29 '22 07:09

McDowell


http://search.maven.org/#search|ga|1|slugify

And here's the GitHub repository to take a look at the code and its usage:

https://github.com/slugify/slugify

like image 38
dtrunk Avatar answered Sep 29 '22 08:09

dtrunk