2010-04-20 24 views
4

我正在嘗試爲一些文章標題創建類似於行爲的固定鏈接,並且我不想爲固定鏈接添加新的數據庫字段。所以我決定寫一個幫手,將轉換我文章標題來自:使用ruby gsub和正則表達式更聰明地替換字符

O 」的focoasă「 一pornit cruciada,împotrivabărbaţilorzgârciţi」 到 「鄰focoasa-A-pornit-cruciada-impotriva- barbatilor-zgarciti「。

雖然我想通了如何使用連字符代替空格和刪除其他特殊字符(除 - )使用:

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

我想知道是否有任何其他方式與特定的其他替換字符字符只有一個.gsub方法調用,所以我不必爲我的本地化的所有UTF-8特殊字符鏈接title.gsub(「ă」,「a」)方法。

我想構建一個包含所有特殊字符及其對應物的散列,但是我還沒有弄清楚如何在正則表達式中使用變量。

我一直在尋找的是這樣的:

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

謝謝!

回答

5

我在我的應用程序解決了這個利用Unidecoder寶石:

require 'unidecode' 

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

嗨,謝謝你的答案!在安裝了寶石後,我無法讓它與require'unicode'一起工作,所以我加了 config.gem'unidecode',:version =>'〜> 1.0.0',:source =>'http:// ruby​​forge .org'到我的環境文件中。 然後在幫手中,我剛剛創建了這個方法,就是這樣! def permalink(title) Unidecoder.decode(title).gsub(/ \ s /,「 - 」)。gsub(/ [^ \ w - ] /,'').downcase end – 2010-04-20 20:44:57

+0

如果您嘗試要求'unicode',那會是你的問題,寶石是'unidecode';) – 2010-04-20 21:03:21

+0

該死!你是對的:)這就是我得到這麼晚工作的原因。再次感謝! – 2010-04-20 21:41:17

4

如果你想只從一個角色到另一個音譯,您可以使用String#tr方法,該方法不完全一樣的東西作爲Unix的tr命令:在第二列表中的相同位置的字符替換第一列表中的每個字符:

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

不過,我同意@Daniel Vandersluis:它很可能是一個好主意使用一些更專業的圖書館。像這樣的東西可能變得非常乏味,非常快。另外,很多這些角色實際上都有標準化的音譯(Ä→ ae,ö→ oe,...,ßss),並且用戶可能希望音譯是正確的(我當然不喜歡被稱爲Jorg   –如果你真的必須的話,你可以叫我Joerg,但我非常喜歡Jörg),如果你有一個圖書館爲你提供這些音譯,爲什麼不使用它們?請注意,有很多音譯不是單個字符,因此無論如何不能與String#tr一起使用。