基于1个或多个匹配的字符串中的粗体项目

时间:2014-06-26 00:27:45

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下内容:

str = "Hello world. Today is Wednesday"
matchedTerms

matchedTerms包含如下数据:

> "world"
> "word, is"

我想做的是像这样更新str:

"Hello <b>world</b>. Today <b>is</b> Wednesday"

在ruby / rails中,给定matchedTerms更新字符串的正确方法是什么?

由于

2 个答案:

答案 0 :(得分:2)

String#gsub方法需要一个块,这可以使这非常简单(并且应该比编写迭代器/循环更有效)。

以下是我如何做到这一点:

matched_terms = ["world", "is"]
pattern = Regexp.new(matched_terms.join("|"), Regexp::IGNORECASE)

str = "Hello world. Today is Wednesday"
result = str.gsub(pattern) { |match| "<b>#{match}</b>" }
# => "Hello <b>world</b>. Today <b>is</b> Wednesday"

我无法理解为什么在给出示例输出的情况下,为"word, is"作为匹配条件之一...所以我只是简化为"is"。如果您真的希望将"word, is"视为另外两个匹配项 - "word""is" - 那么我会提前清理它,如下所示:

matched_terms.map! { |mt| mt.split(", ") }.flatten!

答案 1 :(得分:1)

我不知道这是否适用于您想要的每个模式。但这将返回你想要的东西。

str = "Hello world. Today is Wednesday"
puts str
matchedTerms = ["world", "word, is"]
matchedTerms.each do |term|
  split = term.split
  split.each do |word|
    # case insensitive : str.gsub!(/#{word}/i, "<b>#{word}</b>")
    str.gsub!(word, "<b>#{word}</b>")
  end
end

puts str

>> Hello world. Today is Wednesday
>> Hello <b>world</b>. Today <b>is</b> Wednesday