Ruby post title to slug
Is this Rails? (works in Sinatra)
string.parameterize
That's it. For even more sophisticated slugging, see ActsAsUrl. It can do the following:
"rock & roll".to_url => "rock-and-roll""$12 worth of Ruby power".to_url => "12-dollars-worth-of-ruby-power""10% off if you act now".to_url => "10-percent-off-if-you-act-now""kick it en Français".to_url => "kick-it-en-francais""rock it Español style".to_url => "rock-it-espanol-style""tell your readers 你好".to_url => "tell-your-readers-ni-hao"
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
downcase
makes it lowercase. The strip
makes sure there is no leading or trailing whitespace. The first gsub
replaces spaces with hyphens. The second gsub
removes all non-alpha non-dash non-underscore characters (note that this set is very close to \W
but includes the dash as well, which is why it's spelled out here).
to_slug is a great Rails plugin that handles pretty much everything, including funky characters, but its implementation is very simple. Chuck it onto String and you'll be sorted. Here's the source condensed down:
String.class_eval do def to_slug value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s value.gsub!(/[']+/, '') value.gsub!(/\W+/, ' ') value.strip! value.downcase! value.gsub!(' ', '-') value endend