Skip to content

Instantly share code, notes, and snippets.

@hagemann
Last active September 4, 2024 02:45
Show Gist options
  • Save hagemann/382adfc57adbd5af078dc93feef01fe1 to your computer and use it in GitHub Desktop.
Save hagemann/382adfc57adbd5af078dc93feef01fe1 to your computer and use it in GitHub Desktop.
Slugify makes a string URI-friendly
function slugify(string) {
const a = 'àáâäæãåāăąçćčđďèéêëēėęěğǵḧîïíīįìıİłḿñńǹňôöòóœøōõőṕŕřßśšşșťțûüùúūǘůűųẃẍÿýžźż·/_,:;'
const b = 'aaaaaaaaaacccddeeeeeeeegghiiiiiiiilmnnnnoooooooooprrsssssttuuuuuuuuuwxyyzzz------'
const p = new RegExp(a.split('').join('|'), 'g')
return string.toString().toLowerCase()
.replace(/\s+/g, '-') // Replace spaces with -
.replace(p, c => b.charAt(a.indexOf(c))) // Replace special characters
.replace(/&/g, '-and-') // Replace & with 'and'
.replace(/[^\w\-]+/g, '') // Remove all non-word characters
.replace(/\-\-+/g, '-') // Replace multiple - with single -
.replace(/^-+/, '') // Trim - from start of text
.replace(/-+$/, '') // Trim - from end of text
}
@raydvard
Copy link

Well, I was working with many slugify functions to make a nice url slug from a string. I found it neat and working function, but it would be great to add a little bit more amazing functionality to parse multi language string, wouldn't it ?
like unicoded strings to make it a nice url slug ?
I have tried with french, german, chinese, arabic and bengali string, but it does not work, is there any suggestions or update on this function to make it work ?

@wojtekelvis
Copy link

I think it would be even better with those ąćęśłż :)

@hagemann
Copy link
Author

@wojtekelvis Thanks for contributing! I’ve added these.

@DanRobinsonMV
Copy link

I absolutely love this!

I'd like to know if I'm free to use this code - what license are you distributing it under?

@hagemann
Copy link
Author

hagemann commented Jul 8, 2019

@DanRobinsonMV You are free to use it, even for commercial apps. Would appreciate a link to this Gist in your code so you can always refer back for potential changes!

@zendiik
Copy link

zendiik commented Jul 9, 2019

Wow, that's awesome piece of code :)

I think there's a ě and ď missing.

@hagemann
Copy link
Author

@zendiik Added them. Thanks for helping out!

@DanRobinsonMV
Copy link

@DanRobinsonMV You are free to use it, even for commercial apps. Would appreciate a link to this Gist in your code so you can always refer back for potential changes!

Perfect, thanks so much for the snippet!

@KarllosSouza
Copy link

Great code! Congrats!

Just a suggestion: if we add a .trim() at the end of line 6, we can remove lines 12 and 13.

@hagemann
Copy link
Author

Thanks @KarllosSouza! While technically true, I would keep the original version because it will also discard dashes at the beginning or end: https://jsfiddle.net/mhagemann/7arg58o0/1/

@KarllosSouza
Copy link

Thanks @KarllosSouza! While technically true, I would keep the original version because it will also discard dashes at the beginning or end: https://jsfiddle.net/mhagemann/7arg58o0/1/

Yeah... I didn't think of those cases.
Thanks for the answer!

@Doaa-Ahmed
Copy link

It would be nice if you can add these characters as well ā ē ī ō õ

@hagemann
Copy link
Author

@Doaa-Ahmed I’ve added these characters. Thanks for making this gist better!

@BayBreezy
Copy link

Thanks again!

@kenlas
Copy link

kenlas commented Oct 22, 2019

Thank you Matthias for this function!
Please note that it is missing the letter 'ő' from the hungarian alphabet.

@hagemann
Copy link
Author

@kenlas Very welcome, and thanks :) If other letters are missing, please let me know.

Copy link

ghost commented Nov 4, 2019

arabic

function slugify(string) {
const a = 'àáâäæãåāăąçćčđďèéêëēėęěğǵḧîïíīįìłḿñńǹňôöòóœøōõőṕŕřßśšşșťțûüùúūǘůűųẃẍÿýžźż·/_,:;'
const b = 'aaaaaaaaaacccddeeeeeeeegghiiiiiilmnnnnoooooooooprrsssssttuuuuuuuuuwxyyzzz------'
const p = new RegExp(a.split('').join('|'), 'g')

return string.toString().toLowerCase()
.replace(/\s+/g, '-') // Replace spaces with -
.replace(p, c => b.charAt(a.indexOf(c))) // Replace special characters
.replace(/&/g, '-and-') // Replace & with 'and'
.replace(/[^[a-zA-Z0-9أ-ي]-]+/g, "") // Arabic support
.replace(/--+/g, '-') // Replace multiple - with single -
.replace(/^-+/, '') // Trim - from start of text
.replace(/-+$/, '') // Trim - from end of text
}

@meowsus
Copy link

meowsus commented Jan 27, 2020

@sorahn
Copy link

sorahn commented Apr 22, 2020

@hagemann could you please add an explicit license to this gist? :)

@jyoo
Copy link

jyoo commented Apr 30, 2020

Wow! This is amazing. Thank you so much @hagemann!

@janguianof
Copy link

Thank you so much!

@melih
Copy link

melih commented Jul 24, 2021

It can support Turkish "İ" and "ı" characters with the lines below,

const a = 'àáâäæãåāăąçćčđďèéêëēėęěğǵḧîïíīįìıİłḿñńǹňôöòóœøōõőṕŕřßśšşșťțûüùúūǘůűųẃẍÿýžźż·/_,:;'
const b = 'aaaaaaaaaacccddeeeeeeeegghiiiiiiiilmnnnnoooooooooprrsssssttuuuuuuuuuwxyyzzz------'

@hagemann
Copy link
Author

@melih I’ve added the 2 characters. Thanks for contributing.

@sezerkarakaya
Copy link

Thank you so much.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment