使用gsub替换带链接的单词时如何转义锚链接内容

时间:2012-10-24 19:26:56

标签: ruby ruby-on-rails-3.1 twitter-bootstrap

我需要在一个带链接的句子中替换一系列单词。当我的锚链接中包含一个单词时,我遇到了错误。我使用循环遍历所有单词,因此如果第一个链接包含要替换的当前单词,它将在现有锚标记内再次替换为新链接。

示例:

我有一句话:快速的棕色狐狸跳过懒狗。

我想用<a href="#" data-content="A fox is not a dog">fox< /a>和'狗'替换'Fox':<a href="#" data-content="A dog is a man's best friend">dog</a>

我的代码:

<% text = "The quick brown fox jumps over the lazy dog." %>

<% @definition.each do |d| % ><br/>
<% text = text.gsub(d.word, link_to(d.word, '# ', :class => "popover-definition", :rel => "popover", :title => "<strong>#{d.word}</strong>", :"data-content" => d.meaning)).html_safe %><br/>
<% end %>

** @definition包含单词和用其替换的链接。

当循环第二次运行时,来自'fox'的<a>标签中的'dog'被替换为新链接。当单词包含在锚中时,如何转义字符串替换?

谢谢!

1 个答案:

答案 0 :(得分:1)

在Ruby 1.9.2及更高版本中,您可以将哈希传递给gsub,它会将哈希中的任何键与其值匹配。

来自documentation

  

如果第二个参数是Hash,匹配的文本是其中一个键,则相应的值是替换字符串。

因此,如果您首先从@definition创建哈希:

hash = @definition.inject({}) { |h, d| h[d.word] = d.meaning; h }
#=> {"fox"=>"A fox is not a dog", "dog"=>"A dog is man's best friend"}

然后你可以只用一行进行替换:

text.gsub(%r[#{hash.keys.join('|')}], hash)
#=> "The quick brown A fox is not a dog jumps over the lazy A dog is man's best friend."

只需更新hash即可使用link_to,这应该适合您的情况:

hash = @definition.inject({}) do |h, d|
  h[d.word] = link_to(d.word, '# ', :class => "popover-definition", :rel => "popover", :title => "<strong>#{d.word}</strong>", :"data-content" => d.meaning).html_safe
  h
end
text.gsub(%r[#{hash.keys.join('|')}], hash)