0

文章内でリンクに置き換える必要がある一連の単語があります。アンカー リンクに単語が含まれていると、エラーが発生します。ループを使用してすべての単語をループ処理しているため、最初のリンクに置換対象の現在の単語が含まれている場合、既存のアンカー タグ内の新しいリンクに再度置き換えられます。

例:

私は次の文を持っています:速い茶色のキツネは怠惰な犬を飛び越えます。

<a href="#" data-content="A fox is not a dog">fox< /a>「キツネ」と「犬」を次のように置き換えたい:<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には、単語とそれを置き換えるリンクの両方が含まれています。

ループが 2 回目に実行されると、<a>「fox」のタグの「dog」が新しいリンクに置き換えられます。単語がアンカーに含まれている場合、文字列の置換を回避するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

Ruby 1.9.2 以降では、ハッシュを に渡すことができ、ハッシュgsub内の任意のキーをその値に一致させます。

ドキュメントから:

2 番目の引数がハッシュで、一致したテキストがそのキーの 1 つである場合、対応する値は置換文字列です。

したがって、最初に からハッシュを作成する場合@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"}

次に、1 行で置換を行うことができます。

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 に答える