0

次のように、キャッチされた文字列(大文字と小文字を区別しない)の周囲に<b>を設定する関数を取得しようとしています。

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>"

つまり、/ search / iのような正規表現を見つける必要があります。これは、「「検索」という単語または「検索」という単語にアクセントを付けて見つける必要がある」という意味です。

編集 :

私の例では単純すぎたようです...文字列だけでなく文字列でも機能するはずです:

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

よろしく

ピエール

edit2: この新しい関数で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
4

1 に答える 1

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

于 2013-02-21T17:49:23.900 に答える