Подтвердить что ты не робот

Проверка URL/домена с помощью Regex? (Rails)

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

Я не знаю regex очень хорошо.

4b9b3361

Ответ 1

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

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

FYI: Rubular - фантастический ресурс для тестирования ваших регулярных выражений Ruby

Ответ 2

Ответ на

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

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

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


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

Ответ 3

^(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://

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

Ответ 4

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

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

Ответ 5

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

require 'uri'

def valid_url?(url)
  url.slice(URI::regexp(%w(http https))) == url
end

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

В соответствии с 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. Или, возможно, вы загладили их раньше.

Ответ 9

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

REGEXP = %r{
  \A
  https?://                                                          # http:// or https://
  ([^\s:@]+:[^\s:@]*@)?                                              # optional username:[email protected]
  ( ((#{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

Ответ 10

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

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

Ответ 11

Попробуйте настроить шаблон так, чтобы они начинались с ^ (символ "начинается с" ) и заканчивается символом $( "заканчивается на" ), так что весь шаблон читает "строку, которая начинается с этого, а затем заканчивается", в противном случае совпадение имени, скажем, будет положительным, если шаблон найден вообще (т.е. имеет один единственный правильный символ.)

Ответ 13

Это мой валидатор 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