2013-02-21 32 views
0

我试图得到一个功能设置< B>身边擦肩而过的字符串(不区分大小写),这样GSUB一个正则表达式:请使用具有口音

bold_string("Hello everyone","o") 
> "Hell<b>o</b> every<b>o</b>ne" 

bold_string("HEllo evEryonE", "e") 
> "H<b>E</b>llo <b>e</b>v<b>E</b>ryon<b>E<b/>" 

现在,我的功能看起来像这样:

def bold_string(str, search) 
    str.gsub(/(#{search})/i, '<b>\1</b>') 
end 

它与前面的例子完全一致,但与具有一些口音的单词无关。还有我所期望的结果:

bold_string("Petite bête", "e") 
> "P<b>e</b>tit<b>e</b> b<b>ê</b>t<b>e</b>" 

bold_string("Petite bête", "ê") 
> "P<b>e</b>tit<b>e</b> b<b>ê</b>t<b>e</b>" 

换句话说,我必须要找到一个正则表达式像/搜索/ I,它说:“你必须要找到一些单词‘搜索’或单词‘搜索’口音”。

编辑:

我看到我和我的例子过于simplist ...它应该用绳子工作,而不是简单字符:

bold_string("Petite bête", "êt") 
> "P<b>et</b>ite</b> b<b>êt</b>e" 

问候

皮埃尔

编辑2: 我使用了解决方案FJ的这个新功能

def regex_from_string_including_accents(str) 
    accents = ['aàâ', 'eéèêë', 'oöô' 'iî'] 
    return str.gsub(/./) do |letter| 
    accent_group = accents.detect{|group| group.include?(letter)} 
    accent_group ? "[#{accent_group}]" : letter 
    end 
end 

回答

1

你可以做类似如下:

def bold_string(str, search) 
    h = { "e" => "[eéê]", "a" => "[aáâ]" } 
    regex = search.gsub(/./) {|s| h.fetch(s, s)} 
    str.gsub(/(#{regex})/i, '<b>\1</b>') 
end 

显然,这正说明你如何开始,你需要填写h与字符的额外的重音版本。

例如:http://ideone.com/KukiKc

+0

谢谢你,很好的解决方案......但是dosn't不工作的话。我编辑我的第一条消息,告诉你我的意思。 – pierallard 2013-02-21 18:01:59

+0

看我的编辑,它现在应该用文字。 – 2013-02-21 18:11:07

+0

不错的工作。我在第一个问题上做了一些修改。谢谢 ! – pierallard 2013-02-22 08:09:10