-
-
Save thevangelist/8ff91bac947018c9f3bfaad6487fa149 to your computer and use it in GitHub Desktop.
const convertToKebabCase = (string) => { | |
return string.replace(/\s+/g, '-').toLowerCase(); | |
} |
Some small improvements (perhaps some personal taste involved, as well):
const kebabCase = str => str.match(/[A-Z]{2,}(?=[A-Z][a-z0-9]*|\b)|[A-Z]?[a-z0-9]*|[A-Z]|[0-9]+/g)
.filter(Boolean)
.map(x => x.toLowerCase())
.join('-')
What @Vadorequest provided would cut off a word at any digit followed by a letter, and this solution allows those digits to fall within words like so:
Previously: Som3thing\3lse => som3-thing-3-lse
My version: Som3thing\3lse => som3thing-3lse
@tehpsalmist Could you edit your post to provide an example with your regex vs mine? That'd be even better ;)
I like yours, may indeed be an improvement! But could depend on the needs.
Just adding to this conversation:
function kebabCase (str) {
const result = str.replace(
/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,
match => '-' + match.toLowerCase()
)
return (str[0] === str[0].toUpperCase())
? result.substring(1)
: result
}
console.log(kebabCase('TestMe'))
console.log(kebabCase('test-me'))
console.log(kebabCase('testMe'))
'test-me'
'test-me'
'test-me'
Tested at: https://playcode.io/
Just adding to this conversation:
function kebabCase (str) { const result = str.replace( /[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, match => '-' + match.toLowerCase() ) return (str[0] === str[0].toUpperCase()) ? result.substring(1) : result }console.log(kebabCase('TestMe')) console.log(kebabCase('test-me')) console.log(kebabCase('testMe'))'test-me' 'test-me' 'test-me'
Tested at: playcode.io
American Flag
-> american -flag
For me the issue lies with toLowerCase
, this should only happen IF string was replaced.
chDe
->ch-de
American Flag
->American Flag
Previously:
Som3thing\3lse => som3-thing-3-lse
My version:Som3thing\3lse => som3thing-3lse
Sorry @tehpsalmist
kebabCase('ABC_123') -> 'ab-c-123'
const toKebabCase = str => str && str .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-');
Sorry @Vadorequest
toKebabCase('FOO-BAR') -> ''f-o-o-bar''
str .replace(/([A-Z])([A-Z])/g, '$1-$2') .replace(/([a-z])([A-Z])/g, '$1-$2') .replace(/[\s_]+/g, '-') .toLowerCase()
Sorry @GerardRodes
'FOO-BAR' -> ''f-oo-b-ar''
@oravecz That's a shame! Do you think you have a fix handy?
https://lodash.com/docs/4.17.15#kebabCase I don't use any other nowadays
Unfortunately, I'm not really good at regexes, I just found out a better version and shared it but ain't competent for improving it.