Ruby on Rails - 带有正则表达式的 gsub 会删除一个字符



我有一个文章模型(article.rb):

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

我在我的文章中有这样的gsub.rb:

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

这会将文章文本中的单词 "anylink" 替换为创建自动链接"link_to 'anylink', 'http://website.com/anylink'"。当已经有"link_to..."时,它不会替换,因为我排除了正则表达式中任何链接之后的'

它可以工作,但问题是它会删除"anylink"后面的下一个字符。 例如,它转换:

"Have a look at anylink and see"

"Have a look at anylinkand see"

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

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

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

  • anylinkA
  • anylink.
  • anylink!

如果你想保留你的角色,你可以创建一个匹配项并将其放在替换之后:

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

在这里,匹配的组([^'])将在角色上匹配,转义的1会将该字符放在替换之后。

但我建议你使用b来匹配边界这个词:

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

因此,使用此解决方案,单词 anylink 将被替换为gsub,并且可以在任何字符之前或之后,但不能在字母数字之前或之后。

如果要替换 self.content 中的所有匹配项,请添加g正则表达式修饰符:

self.content.gsub!(/banylinkb/ig, "<%= link_to 'anylink', 'http://website.com/anylink' %>")

相关内容

  • 没有找到相关文章

最新更新