4

我正在尝试为某些文章标题创建类似于永久链接的行为,并且我不想为永久链接添加新的 db 字段。所以我决定写一个助手来转换我的文章标题:

" O "focoasă" a pornit cruciada, împotriva bărbaţilor zgârciţi " 到 " o-focoasa-a-pornit-cruciada-impotriva-barbatilor-zgarciti "。

虽然我想出了如何用连字符替换空格并使用以下方法删除其他特殊字符( - 除外):

title.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase

我想知道是否有任何其他方法可以仅通过一个 .gsub 方法调用将字符替换为特定的其他字符,因此我不必为所有的链接 title.gsub("ă", "a") 方法我本地化的 UTF-8 特殊字符。

我正在考虑用所有特殊字符及其对应物构建一个哈希,但我还没有弄清楚如何将变量与正则表达式一起使用。

我一直在寻找的是这样的:

title.gsub(/\s/, "-").gsub(*replace character goes here*).gsub(/[^\w-]/, '').downcase

谢谢!

4

2 回答 2

5

我通过使用Unidecoder gem 在我的应用程序中解决了这个问题:

require 'unidecode'

def uninternationalize(str)
  Unidecoder.decode(str).gsub("[?]", "").gsub(/`/, "'").strip
end
于 2010-04-20T19:55:09.860 回答
4

如果只想从一个字符音译到另一个字符,可以使用与String#trUnix 命令完全相同的方法tr:将第一个列表中的每个字符替换为第二个列表中相同位置的字符:

'Ünicöde'.tr('ÄäÖöÜüß', 'AaOoUus') # => "Unicode"

但是,我同意@Daniel Vandersluis:使用一些更专业的库可能是个好主意。像这样的事情会变得非常乏味,非常快。此外,许多这些字符实际上都有标准化的音译(ä → ae、ö → oe、...、ß → ss),用户可能希望音译正确(我当然不喜欢被称为 Jorg – 如果你真的需要,你可以叫我 Joerg,但我更喜欢 Jörg)如果你有一个图书馆可以为你提供这些音译,为什么不使用它们呢?请注意,有很多音译不是单个字符,因此String#tr无论如何都不能使用。

于 2010-04-20T21:43:48.697 回答