我有一个文章模型(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' %>")