我正在尝试创建一个验证,检查以确保域/网址有效,例如“test.com”
def valid_domain_name?
domain_name = domain.split(".")
name = /(?:[A-Z0-9\-])+/.match(domain_name[0]).nil?
tld = /(?:[A-Z]{2}|aero|ag|asia|at|be|biz|ca|cc|cn|com|de|edu|eu|fm|gov|gs|jobs|jp|in|info|me|mil|mobi|museum|ms|name|net|nu|nz|org|tc|tw|tv|uk|us|vg|ws)/.match(domain_name[1]).nil?
if name == false or tld == false
errors.add(:domain_name, 'Invalid domain name. Please only use names with letters (A-Z) and numbers (0-9).')
end
end
这是我到目前为止所做的,但它不起作用。它可以让错误的URL通过而不会失败。
我不太了解正则表达式。
答案 0 :(得分:54)
偶然发现:
validates_format_of :domain_name, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
仅供参考:Rubular是测试Ruby正则表达式的绝佳资源
答案 1 :(得分:26)
@ Tate的答案适用于完整的URL,但是如果你想验证domain
列,你不希望允许他的正则表达式允许的额外URL位(例如,你绝对不希望允许带有文件路径的URL)。
所以我删除了正则表达式的协议,端口,文件路径和查询字符串部分,结果如下:
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}$
查看两个版本的相同测试用例。
答案 2 :(得分:11)
^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix
http://rubular.com/r/cdkLxAkTbk
添加了可选的 http:// 或 https://
最长的顶级域名 .museum
,有6个字符......
答案 3 :(得分:9)
在Rails中进行URL验证的另一种方法是
validates :web_address, :format => { :with => URI::regexp(%w(http https)), :message => "Valid URL required"}
答案 4 :(得分:6)
require 'uri'
def valid_url?(url)
url.slice(URI::regexp(%w(http https))) == url
end
答案 5 :(得分:2)
我拿走了您的内容并进行了修改,以便http://
或https://
可选:
/^((http|https):\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
答案 6 :(得分:2)
对我有用的是
def validate_url(text)
uri = URI.parse(text)
raise URI::InvalidURIError unless uri.kind_of?(URI::HTTP) || uri.kind_of?(URI::HTTPS)
rescue URI::InvalidURIError
errors.add(:url, 'is invalid')
end
end
答案 7 :(得分:1)
According to google,这个很好用:
/^([a-z0-9]([-a-z0-9]*[a-z0-9])?\\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i
有点冗长......
它不区分大小写...它看起来不像你的正则表达式,但我不知道Ruby。或者也许你早些时候将它们大写了。
答案 8 :(得分:1)
我喜欢这个用于验证网址的插件: https://github.com/henrik/validates_url_format_of/tree
答案 9 :(得分:1)
使用Brian Ray上面的回答,我认为回答问题(域名不是网址)并为Rails 4更新。
/\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}\z/ix
答案 10 :(得分:0)
尝试调整模式,使它们以^开头(以“开头”字符开头),以$结尾(“以...结尾”),以便整个模式读取“以此开头然后结束的字符串”如果根本找到模式,那么匹配名称,比方说,将是一个正匹配(即有一个正确的字符。)
答案 11 :(得分:0)
^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$
答案 12 :(得分:-1)
这是我的URL验证器,使用Ruby的内置解析器
class UrlValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
p = URI::Parser.new
valid = begin
p.parse(value)
true
rescue
false
end
unless valid
record.errors[attribute] << (options[:message] || "is an invalid URL")
end
end
end