Проверка имени домена в Ruby on Rails (регулярное выражение) - PullRequest
5 голосов
/ 03 июня 2011

Я пытаюсь использовать регулярное выражение для проверки формата доменного имени в моей модели Rails.Я протестировал регулярное выражение в Rubular с именем домена http://trentscott.com, и оно совпало.

Любая идея, почему он не проходит проверку, когда я тестирую его в своем приложении Rails (оно говорит: «имя недействительно»).

Код:

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

  validates :serial, :presence => true
  validates :name, :presence => true,
                   :format    => {  :with => domain_regex  }

Ответы [ 5 ]

14 голосов
/ 03 июня 2011

Вам не нужно использовать регулярное выражение здесь. У Ruby есть гораздо более надежный способ сделать это:

# Use the URI module distributed with Ruby:

require 'uri'

unless (url =~ URI::regexp).nil?
    # Correct URL
end

(этот ответ приходит от этого поста :)

10 голосов
/ 03 июня 2011

(мне нравится ответ Томаса Хупкенса, но для просмотра другими людьми я рекомендую Addressable)

Не рекомендуется использовать регулярные выражения для проверки URL.

Используйте библиотеку URI Ruby или ее замену, например Addressable , что делает проверку URL тривиальной. В отличие от URI, Addressable также может обрабатывать международные символы и tlds.

Пример использования:

require 'addressable/uri'

Addressable::URI.parse("кц.рф") # Works

uri = Addressable::URI.parse("http://example.com/path/to/resource/")
uri.scheme
#=> "http"
uri.host
#=> "example.com"
uri.path
#=> "/path/to/resource/"

И вы можете создать пользовательскую проверку, например:

class Example
  include ActiveModel::Validations

  ##
  # Validates a URL
  #
  # If the URI library can parse the value, and the scheme is valid
  # then we assume the url is valid
  #
  class UrlValidator < ActiveModel::EachValidator
    def validate_each(record, attribute, value)
      begin
        uri = Addressable::URI.parse(value)

        if !["http","https","ftp"].include?(uri.scheme)
          raise Addressable::URI::InvalidURIError
        end
      rescue Addressable::URI::InvalidURIError
        record.errors[attribute] << "Invalid URL"
      end
    end
  end

  validates :field, :url => true
end

Кодовый источник

7 голосов
/ 03 июня 2011

Ваш ввод (http://trentscott.com) не имеет субдомена, но регулярное выражение проверяет его.

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

Обновление

Тебе тоже не нужен? после ((http | https): \ / \ /), если протокол иногда отсутствует. Я тоже сбежал. потому что это будет соответствовать любому персонажу. Я не уверен, для чего предназначена группировка выше, но вот лучшая версия, которая поддерживает тире и группы по разделам

domain_regex = /^((http|https):\/\/) 
(([a-z0-9-\.]*)\.)?                  
([a-z0-9-]+)\.                        
([a-z]{2,5})
(:[0-9]{1,5})?
(\/)?$/ix
1 голос
/ 11 октября 2016

Попробуй это. Это работает для меня.
/ (FTP | HTTP | HTTPS): // (\ ш + {0,1} \ ш * @) (\ S +)? (: [0-9] +) (/ | / ([\ ш #! :.?!? + = &% @ - /])) / * * 1002

0 голосов
/ 31 января 2017

Это будет включать обработку международного хоста, такую ​​как abc.com.it, где часть .it необязательна

match '/:site', to: 'controller#action' , constraints: { site: /[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}(.[a-zA-Z]{2,63})?/}, via: :get, :format => false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...