Проверка для URL / домена с помощью Regex? (Rails) - PullRequest
27 голосов
/ 15 июля 2009

Я пытаюсь создать проверку, которая проверяет, является ли домен / URL действительным, например, "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 ]

54 голосов
/ 15 июля 2009

Наткнулся на это:

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

26 голосов
/ 06 октября 2011

@ Ответ Тейта подходит для полного URL, но если вы хотите проверить столбец domain, вы не хотите разрешать дополнительные биты URL, которые его регулярное выражение разрешает (например, вы определенно не хотите разрешать URL с путем к файлу).

Итак, я удалил части регулярного выражения, относящиеся к протоколу, порту, пути к файлу и строке запроса, в результате чего:

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


Проверьте одинаковые контрольные примеры для обеих версий.

11 голосов
/ 09 ноября 2012
^(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 /? = Материал верно
  • example.com: 5000 / материал = правда
  • sub.domain.my-example.com / путь / к / файлу / hello.html
  • hello.museum
  • http://railsgirls.com

http://rubular.com/r/cdkLxAkTbk

Добавлены необязательные http:// или https://

Самый длинный TLD - .museum, который состоит из 6 символов ...

10 голосов
/ 15 мая 2013

Еще один способ проверки URL в Rails -

validates :web_address, :format => { :with => URI::regexp(%w(http https)), :message => "Valid URL required"}
6 голосов
/ 05 июня 2013

Лучший ответ, начиная с Ruby 1.8.6

require 'uri'

def valid_url?(url)
  url.slice(URI::regexp(%w(http https))) == url
end
2 голосов
/ 01 июля 2016

Что работает для меня это

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
2 голосов
/ 19 августа 2010

Я взял то, что у тебя было, и изменил его, чтобы я мог сделать http:// или https:// необязательным:

/^((http|https):\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
1 голос
/ 23 августа 2016

Используя ответ Брайана Рэя выше, который, я думаю, отвечает на вопрос (домен не URL) и обновляя его для Rails 4.

/\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}\z/ix
1 голос
/ 15 июля 2009

Вот регулярное выражение, используемое validates_url_format_of Хенрика валидатора Rails :

REGEXP = %r{
  \A
  https?://                                                          # http:// or https://
  ([^\s:@]+:[^\s:@]*@)?                                              # optional username:pw@
  ( ((#{ALNUM}+\.)*xn---*)?#{ALNUM}+([-.]#{ALNUM}+)*\.[a-z]{2,6}\.? |  # domain (including Punycode/IDN)...
      #{IPv4_PART}(\.#{IPv4_PART}){3} )                              # or IPv4
  (:\d{1,5})?                                                        # optional port
  ([/?]\S*)?                                                         # optional /whatever or ?whatever
  \Z
}iux
1 голос
/ 15 июля 2009

Согласно 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

Немного длиннее ...

Это без учета регистра ... это не похоже на ваши регулярные выражения, но я не знаю Руби. Или, может быть, вы использовали их раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...