0

私は記事モデル(article.rb)を持っています:

class Article < ActiveRecord::Base
  attr_accessible :name, :content
end

gsubのarticle.rbには次のようなものがあります:

self.content.gsub!(/anylink[^']/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>")

"anylink"これにより、記事のテキスト内の単語が に置き換え"link_to 'anylink', 'http://website.com/anylink'"られ、自動リンクが作成されます。正規表現で after anylinkを除外したため、既に がある場合は"link_to..."置換されません。'

動作しますが、問題は、次の文字を削除すること"anylink"です。たとえば、次のように変換します。

"Have a look at anylink and see"

"Have a look at anylinkand see"

"anylink"この 2 番目のフレーズはハイパーリンクになっているため、gsub操作中に削除された空白以外は問題ありません。これを回避できる理由と方法はありますか?

4

1 に答える 1

2

String#gsubパターンの一致部分全体を置換で置き換えます。これは、anylink文字列アポストロフィではない 1 文字です。

したがって、たとえば次の文字列を置き換えます。

  • anylinkA
  • anylink.
  • anylink!

キャラクターを維持したい場合は、マッチを作成し、それを置換の後に置くことができます:

self.content.gsub!(/anylink([^'])/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>\\1")

ここで、一致するグループ([^'])が文字に一致し、エスケープ\1された文字が置換後に配置されます。

ただし、 を使用して単語の境界\bに一致させることをお勧めします。

self.content.gsub!(/\banylink\b/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>")

したがって、このソリューションでは、anylink という単語が に置き換えられ、gsub任意の文字の前後に置くことができますが、英数字は使用できません。

のすべての一致を置き換えたい場合は、正規表現修飾子self.contentを追加します。g

self.content.gsub!(/\banylink\b/ig, "<%= link_to 'anylink', 'http://website.com/anylink' %>")
于 2013-01-31T12:12:01.770 に答える