后端验证轨道

时间:2014-05-09 14:28:37

标签: ruby-on-rails validation

如何验证文本列不包含网站,示例可以是:

www.google.com
google.com
http://gooogle.com
http://www.google.com
https://www.google.com
https://google.com

我想在正面但在后端也这样做。我现在对后端更感兴趣,因为我将在稍后处理前端

问题更新:

根据MrYoshiji提供的例子,我提出了未涵盖的案例:

http://rubular.com/r/VGgWyfIt7R

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

3 个答案:

答案 0 :(得分:2)

我找到了一个强大的正则表达式,积分归@PhillPafford(PHP RegEx for "Website Name"如果你赞成我的答案,请首先投票!):

/^(([\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})*)?$/

要看到它的实际效果:

http://rubular.com/r/GOHHrucCdX


<强>更新

本文将在文本的任何位置找到名称:

/(([\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})*)*(\?(&amp;?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/

请注意,我在开始时删除了^,在结尾处删除了$,以使其在文本中有效:

Rubular来源:

  

^行首

     

$行结束

http://rubular.com/r/iEVzfv2U3O


@GandalfStormCrow注意到以下内容匹配:

Since I was little.My first dog
                #^^^

我认为解决此问题的唯一方法是将little.My替换为little. My

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" 

答案 1 :(得分:0)

在您的模型中添加:

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

Here's where I crafted the Regex

答案 2 :(得分:-1)

我看到很多人采取了正则表达式的方法,但也许你想创建一个简单的黑名单。类似的东西:

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

我这样做的原因是你可以轻松添加更多的网址(facebook.com,twitter.com),它仍然可以正常工作,并且在正常表现没有看到代码一年之后就清楚了我的眼睛(和大脑:-))太神秘了。此外,如果您不想每次检查整个黑名单,您可以在验证方法的核心条件中添加一个中断,但我认为用户将有更好的反馈。