后端validation轨道

如何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 ? 它不匹配? 这正是我需要匹配的东西。 所以我可以抛出validation错误,说你不能放网站。

我找到了一个强大的正则表达式,积分转到@PhillPafford( PHP RegEx为“网站名称”如果你赞成我的答案,请首先投票!):

 /^(([\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})*)*(\?(&?([-+_~.\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替换little.My little. My little. My

 text.gsub(/\w\.[AZ]/) { |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\.[AZ]/) { |matched_string| matched_string.gsub('.', '. ') } => "hello my name is robert. My dog" 

在你的模型中添加:

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

这是我制作正则表达式的地方

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

 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 

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