使用RegexvalidationURL /域? (导轨)

我正在尝试创建一个validation,检查以确保域/ URL有效,例如“test.com”

def valid_domain_name? domain_name = domain.split(".") name = /(?:[A-Z0-9\-])+/.match(domain_name[0]).nil? tld = /(?:[AZ]{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 (AZ) and numbers (0-9).') end end 

这是我到目前为止所做的,但它不起作用。 它可以让错误的URL通过而不会失败。

我不太了解正则表达式。

偶然发现:

 validates_format_of :domain_name, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix 

仅供参考: Rubular是测试Ruby正则表达式的绝佳资源

@Tate的答案适用于完整的URL,但如果要validationdomain列,则不希望允许其正则表达式允许的额外URL位(例如,您绝对不希望允许带有路径的URL一份文件)。

所以我删除了正则表达式的协议,端口,文件路径和查询字符串部分,结果如下:

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}$


查看两个版本的相同测试用例。

  • 原始(允许域名完整url): http : //rubular.com/r/qGInC06jcz
  • 修改( 允许域): http : //rubular.com/r/yP6dHFEhrl
 ^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix 
  • example.com
  • sub.example.com
  • sub.domain.my-example.com
  • example.com/?stuff=true
  • example.com:5000/?stuff=true
  • sub.domain.my-example.com/path/to/file/hello.html
  • hello.museum
  • http://railsgirls.com

http://rubular.com/r/cdkLxAkTbk

添加了可选的http://https://

最长的TLD是.museum ,有6个字符……

在Rails中进行URLvalidation的另一种方法是

 validates :web_address, :format => { :with => URI::regexp(%w(http https)), :message => "Valid URL required"} 

自Ruby 1.8.6以来更好的答案

 require 'uri' def valid_domain_name?(domain_name) domain_name =~ URI::regexp(%w(http https)) end 

对我有用的是

 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 

我拿走你所拥有的并修改它以便我可以使http://https://可选:

 /^((http|https):\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix 

根据谷歌 ,这个很好地工作:

 /^([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。 或许你早些时候把它们大写了。

我喜欢这个用于validationURL的插件: https : //github.com/henrik/validates_url_format_of/tree

使用上面的Brian Ray的回答,我认为回答问题(域不是url)并为Rails 4更新它。

 /\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}\z/ix 

尝试调整模式,使它们以^开头(以“开头”字符开头),以$结尾(“以…结尾”),以便整个模式读取“以此开头然后结束的字符串”,否则匹配名称,比方说,如果找到模式,则匹配为正数(即有一个正确的字符。)

 ^(([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})$ 

使用RegEx进行域名validation

这是我的URLvalidation器,使用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