我有一篇文章模型(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
操作期间删除的缺失空间。任何想法为什么以及如何避免这种情况?
答案 0 :(得分:2)
String#gsub
将替换您的模式的整个匹配部分替换为anylink
字符串和一个不是撇号的字符。
所以它会替换以下字符串,例如:
anylinkA
anylink.
anylink!
如果你想保留你的角色,你可以创建一个匹配并在替换后放置它:
self.content.gsub!(/anylink([^'])/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>\\1")
此处匹配组([^'])
将匹配该字符,转义\1
将在您替换后放置该字符。
但我建议您使用\b
来匹配word boundary:
self.content.gsub!(/\banylink\b/i, "<%= link_to 'anylink', 'http://website.com/anylink' %>")
因此,使用此解决方案,anylink一词将被gsub
替换,并且可以在任何字符之前或之后,但不能使用字母数字。
如果您要替换self.content
中的所有匹配项,请添加g
regexp修饰符:
self.content.gsub!(/\banylink\b/ig, "<%= link_to 'anylink', 'http://website.com/anylink' %>")