我该如何在Ruby中将文章标题转换为slug?
标题可以包含任何字符,但我只希望slug允许[a-z0-9-_]
(是否应允许其他字符?)。
基本上:
- 将所有字母转换为小写
- 将空格转换为连字符
- 删除多余字符
这是Rails吗?(在Sinatra中可以运行)
string.parameterize
就是这样。对于更加复杂的slug处理,请参考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"
slug = title.strip.downcase.gsub(/(&|&)/, ' and ').gsub(/[\s\.\/\\]/, '-').gsub(/[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[-_]$/, '')
。 - ma11hew28parameterize
就是这样做的。它来自于 ActiveSupport::Inflector。如果你查看源代码,你会看到注释 "# Replace accented chars with their ASCII equivalents
"。 - Mark Thomasslug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
downcase
将其变为小写字母。 strip
用于确保没有前导或尾随的空格。第一个 gsub
用连字符替换空格。第二个 gsub
移除所有非字母、非破折号和非下划线的字符(请注意,这个集合与 \W
非常接近,但包括破折号,这就是为什么在这里进行拼写的原因)。
slug = title.strip.downcase.gsub(/[\s\.\/\\]/, '-').gsub(/[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[-_]$/, '')
。我意识到这很难完美地实现,所以就停止了。此外,tr
比 gsub
更快,因此最好使用 tr(' ', '-')
而不是 gsub(' ', '-')
。 - ma11hew28slug = title.downcase.gsub('/[\s.\/_]/, ' ').squeeze(' ').strip.gsub(/[^\w-]/, '').tr(' ', '-')
。这首先将所有空格、.
、/
和_
转换为空格。然后挤压空格(所有2个或更多空格的序列变成单个空格),然后删除空格(删除前导和尾随空格),然后将剩余的空格转换回破折号。 - Ben Leeslug = title.parameterize
。即使您没有使用 Rails,也可以通过执行以下操作从 active support gem 中获得相同的支持:require 'active_support'; $KCODE = 'UTF8';
- Ben Leeslug = title.downcase.gsub('/[\s.\/_]/, ' ').squeeze(' ').strip.tr(' ', '-').gsub(/[^\w-]/, '')
- Ben Leeto_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
value
,因为当没有进行任何替换时(例如 "test".to_slug
),.gsub!
会返回 nil。我已经为您修正了代码。 - Yarin我喜欢FriendlyId,它自称是创建slug的“瑞士军刀推土机”。https://github.com/norman/friendly_id