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'"为创建自动链接。当已经有 a"link_to..."时,它不会替代,因为我'在正则表达式中排除了 after anylink。

它有效,但问题是它删除了"anylink". 例如它转换:

"Have a look at anylink and see"

"Have a look at anylinkand see"

"anylink"在第二个短语中现在是一个超链接,所以一切都很好,除了在操作过程中删除的缺失空间gsub。任何想法为什么以及如何避免这种情况?

4

1 回答 1

2

String#gsub用你的替换替换你的模式的整个匹配部分,这里是anylink字符串一个不是撇号的字符。

因此它将替换以下字符串,例如:

  • 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项,请添加gregexp 修饰符:

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