Ruby on rails 后端验证轨道

Ruby on rails 后端验证轨道,ruby-on-rails,validation,Ruby On Rails,Validation,如何验证不包含网站的文本列,例如: www.google.com google.com http://gooogle.com http://www.google.com https://www.google.com https://google.com 我想在前面这样做,但在后端也一样。我现在对后端更感兴趣,因为我将在稍后处理前端 问题更新: 根据Yoshiji先生提供的示例,我提出了未涵盖的案例: 请参阅http://www.google.com在正文的中间?它是不匹配的吗?这正是我需要匹

如何验证不包含网站的文本列,例如:

www.google.com
google.com
http://gooogle.com
http://www.google.com
https://www.google.com
https://google.com
我想在前面这样做,但在后端也一样。我现在对后端更感兴趣,因为我将在稍后处理前端

问题更新:

根据Yoshiji先生提供的示例,我提出了未涵盖的案例:

请参阅
http://www.google.com在正文的中间?它是不匹配的吗?这正是我需要匹配的。所以我可以抛出验证错误,说您不能放置网站。

在您的模型中添加:

validates_format_of :your_column, without: /\A((http(s)?:)?\/\/(www)?.)?(www.)?[a-zA-Z]*.com\z/

我发现了一个强大的regexp,积分归@PhillPafford(如果你支持我的答案,请支持他的第一个!)

要看到它的作用:

1.9.3p489 :018 > text = "hello my name is robert.My dog"
 => "hello my name is robert.My dog" 
1.9.3p489 :019 > text.gsub(/\w\.[A-Z]/) { |matched_string| matched_string.gsub('.', '. ') }
 => "hello my name is robert. My dog" 


更新:

这一个将在文本中的任何位置找到名称:

/(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/
请注意,我删除了开头的
^
和结尾的
$
,以使其在文本中工作:

红细胞来源:

^起跑线

$行尾


@甘道夫·斯道姆克罗注意到以下情况是匹配的:

Since I was little.My first dog
                #^^^
我认为解决这个问题的唯一方法是用
little.My
替换
little。我的

text.gsub(/\w\.[A-Z]/) { |matched_string| matched_string.gsub('.', '. ') }
在行动中看到它:

1.9.3p489 :018 > text = "hello my name is robert.My dog"
 => "hello my name is robert.My dog" 
1.9.3p489 :019 > text.gsub(/\w\.[A-Z]/) { |matched_string| matched_string.gsub('.', '. ') }
 => "hello my name is robert. My dog" 

我看到很多人都采用了正则表达式的方法,但也许你想创建一个简单的黑名单。比如:

class MyModel < ActiveRecord::Base
  BLACKLIST = [
    'google.com'
  ]

  validate :disallow_blacklisted_urls

  private
  def disallow_blacklisted_urls
    BLACKLIST.each do |blacklisted_url|
      if my_field && my_field.include?(blacklisted_url)
        errors.add(:my_field, "must not contain #{blacklisted_url}")
      end
    end
  end
end
classmymodel

我这样做的原因是,你可以很容易地添加更多的URL(facebook.com,twitter.com),而且在一年没有看到代码之后,它仍然可以工作,而且很清晰,而正则表达式对于我的老眼睛来说太神秘了(和大脑:-)。另外,如果您不想每次都检查整个黑名单,您可以在验证方法的核心条件中添加一个中断,但我认为用户会得到更好的反馈。

在问题的字里行间阅读。那谷歌呢?.CO.U.?域名有哪些数字?@ MryoSHIJI我尽量不:你的最终目标是什么?”DigkyBooT我不想让人们在文本框中粘贴网站,我正在验证它能很好地用于域名匹配,但是当我把Google网站放在你的文本中间时。它不匹配,这就是我要找的,请看这个正则表达式让“google.com”通过。(反勾号不适用于空格)这就是为什么在测试前调用
.strip
。。。。。。您不希望用户在保存任何输入之前使用1个或多个空格,是吗?请向下投票解释@是你吗?结果我更新了我的答案;)希望这个对你来说足够好!