使用ruby gsub和regexp更智能地替换字符

时间:2010-04-20 19:50:49

标签: ruby-on-rails ruby string replace gsub

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

O”focoasă“a pornit cruciada,împotrivabărbaţilorzgârciţi”to to  “邻focoasa-A-pornit-cruciada-impotriva-barbatilor-zgarciti ”。

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

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

我想知道是否还有其他方法可以用一个.gsub方法调用替换一个特定的其他字符的字符,所以我不必链接title.gsub(“ă”,“a”)方法对于我本地化的所有UTF-8特殊字符。

我正在考虑用所有特殊字符和它们的对应物构建一个哈希,但我还没有弄清楚如何使用regexp的变量。

我所寻找的是:

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

谢谢!

2 个答案:

答案 0 :(得分:5)

我在我的应用程序中使用Unidecoder gem:

解决了这个问题
require 'unidecode'

def uninternationalize(str)
  Unidecoder.decode(str).gsub("[?]", "").gsub(/`/, "'").strip
end

答案 1 :(得分:4)

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

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

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