如何验证文本列不包含网站,示例可以是:
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
?它不匹配?这正是我需要它匹配的东西。所以我可以抛出验证错误,说你不能放网站。
答案 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})*)*(\?(&?([-+_~.\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/
答案 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),它仍然可以正常工作,并且在正常表现没有看到代码一年之后就清楚了我的眼睛(和大脑:-))太神秘了。此外,如果您不想每次检查整个黑名单,您可以在验证方法的核心条件中添加一个中断,但我认为用户将有更好的反馈。