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个或多个空格,是吗?请向下投票解释@是你吗?结果我更新了我的答案;)希望这个对你来说足够好!