我需要在一个带链接的句子中替换一系列单词。当我的锚链接中包含一个单词时,我遇到了错误。我使用循环遍历所有单词,因此如果第一个链接包含要替换的当前单词,它将在现有锚标记内再次替换为新链接。
示例:
我有一句话:快速的棕色狐狸跳过懒狗。
我想用<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'被替换为新链接。当单词包含在锚中时,如何转义字符串替换?
谢谢!
答案 0 :(得分:1)
在Ruby 1.9.2及更高版本中,您可以将哈希传递给gsub
,它会将哈希中的任何键与其值匹配。
如果第二个参数是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)