0

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

例子:

我有一句话:敏捷的棕色狐狸跳过懒惰的狗。

我想将 'Fox' 替换为<a href="#" data-content="A fox is not a dog">fox< /a>,将 'Dog' 替换为:<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包含单词和替换它的链接。

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

谢谢!

4

1 回答 1

1

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

文档中:

如果第二个参数是一个哈希,并且匹配的文本是它的一个键,那么对应的值就是替换字符串。

因此,如果您首先从以下位置创建哈希@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)
于 2012-10-25T00:03:34.007 回答