用于设置自动链接的正则表达式

时间:2013-01-30 17:21:51

标签: ruby-on-rails regex ruby-on-rails-3

我有一篇文章模型:

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

我现在想要添加一个before_save:createlinks回调,它会自动将文章中的所有单词替换为链接,以防该单词也是另一篇文章的名称。例如。我有一篇名为“Test”的文章,我用以下内容创建了一篇新文章:“你可以在这里看到一个测试。”我需要一个自动链接到“测试”文章之间的“a”和“here”。

我的方法是添加article.rb:

before_save :createlinks

def createlinks
  Article.all.each do |article|
    unless self.name == article.name
      self.content.gsub!(/#{article.name}/i, "<%= link_to '#{article.name}', 'http://localhost:3000/articles/#{article.id}' %>")
    end
  end
end

第一个除非只是为了避免文章链接到自身。这适用于第一个更新操作,但秒更新将所有“link_to'测试'等等...”替换为“link_to”link_to'etc“。

所以我想排除gsub替换两个'-characters之间的所有名称(这意味着它已经用link_to'Test'代替)。我的方法是:

除非self.content =〜/'#{article.name}'/ || self.name == article.name

原则上这也有效,但这会导致一旦创建一个链接就不再设置其他链接,因为只要找到一个'Test'就会跳过整个gsub。

解决此问题的最佳方法是什么?是否有一个正则表达式“替换所有self.content是article.name,但只有当article.name没有'在单词之前'时?换句话说,如何在正则表达式中添加不应该存在的字符?或者有更好的方法来解决整个问题吗?

1 个答案:

答案 0 :(得分:0)


def extract_name(title)
  match = title.match /'(.*)'/
  match ? match[1] : title
end

def createlinks
  Article.all.each do |article|
    extracted_title = extract_name(article.name)
    unless self.name == extracted_title
      self.content.gsub!(/#{article.name}/i, link_to(extracted_title, 'http...'), 'http://localhost:3000/articles/#{article.id}' %>")
    end
  end
end