使用Regex验证URL /域? (导轨)

时间:2009-07-14 21:29:26

标签: ruby-on-rails regex

我正在尝试创建一个验证,检查以确保域/网址有效,例如“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通过而不会失败。

我不太了解正则表达式。

13 个答案:

答案 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
  • 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://

最长的顶级域名 .museum ,有6个字符......

答案 3 :(得分:9)

在Rails中进行URL验证的另一种方法是

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

答案 4 :(得分:6)

自Ruby 1.8.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})$

Domain name validation with RegEx

答案 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