Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to create SEO friendly URI string

The method should allows only "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" chars in URI strings.

What is the best way to make nice SEO URI string?

like image 368
MatBanik Avatar asked Jan 02 '11 23:01

MatBanik


3 Answers

This is what the general consensus is:

  1. Lowercase the string.

    string = string.toLowerCase();
    
  2. Normalize all characters and get rid of all diacritical marks (so that e.g. é, ö, à becomes e, o, a).

    string = Normalizer.normalize(string, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
    
  3. Replace all remaining non-alphanumeric characters by - and collapse when necessary.

    string = string.replaceAll("[^\\p{Alnum}]+", "-");
    

So, summarized:

public static String toPrettyURL(String string) {
    return Normalizer.normalize(string.toLowerCase(), Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
        .replaceAll("[^\\p{Alnum}]+", "-");
}
like image 164
BalusC Avatar answered Nov 19 '22 14:11

BalusC


The following regex will do the same thing as your algorithm. I'm not aware of libraries for doing this type of thing.

String s = input
.replaceAll(" ?- ?","-") // remove spaces around hyphens
.replaceAll("[ ']","-") // turn spaces and quotes into hyphens
.replaceAll("[^0-9a-zA-Z-]",""); // remove everything not in our allowed char set
like image 42
killdash9 Avatar answered Nov 19 '22 14:11

killdash9


These are commonly called "slugs" if you want to search for more information.

You may want to check out other answers such as How can I create a SEO friendly dash-delimited url from a string? and How to make Django slugify work properly with Unicode strings?

They cover C# and Python more than javascript but have some language-agnostic discussion about slug conventions and issues you may face when making them (such as uniqueness, unicode normalization problems, etc).

like image 1
Josh Segall Avatar answered Nov 19 '22 14:11

Josh Segall