Ruby帖子标题为slug

ma1*_*w28 47 ruby string lowercase gsub

我应该如何将帖子标题转换为Ruby中的slug?

标题可以有任何字符,但我只想让slug允许[a-z0-9-_](它应该允许任何其他字符?).

所以基本上:

  • 把所有字母都写下来
  • 将空格转换为连字符
  • 删除无关的字符

Mar*_*mas 95

这是Rails吗?

string.parameterize
Run Code Online (Sandbox Code Playgroud)

而已.有关更复杂的段塞,请参阅ActsAsUrl.它可以执行以下操作:

"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"
Run Code Online (Sandbox Code Playgroud)


Ben*_*Lee 79

slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
Run Code Online (Sandbox Code Playgroud)

downcase使它小写.在strip确保没有开头或结尾的空白.第一个gsub用连字符替换空格.第二个gsub删除所有非alpha非破折号非下划线字符(请注意,此设置非常接近,\W但也包括破折号,这就是为什么它在这里拼写).

  • 谢谢,本。我增加了一些复杂性来解释 . \ / 并在一行中删除多个 - 并将它们从末尾删除:`slug = title.strip.downcase.gsub(/[\s\.\/\\]/, '-').gsub( /[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[- _]$/, '')`。在意识到要让它完美起来非常复杂后,我停了下来。此外,`tr` 比 `gsub` 快,所以最好这样做:`tr(' ', '-')` 比 `gsub(' ', '-')`。 (2认同)

Jam*_*low 7

to_slug是一个很棒的Rails插件,可以处理几乎所有的东西,包括时髦的角色,但它的实现非常简单.将它放到String上,你就会被分类.这是缩小的来源:

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
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @JamieRumbelow-您的示例代码有错误。你需要明确地返回`value`,因为.gsub!当没有执行替换时返回 nil(例如,`"test".to_slug` 将返回 nil)。我为你修复了代码。 (4认同)