Ruby on Rails域名验证(正则表达式)

时间:2011-06-03 18:33:51

标签: ruby-on-rails regex validation dns format

我正在尝试使用正则表达式来验证Rails模型中域名的格式。我已经使用域名http://trentscott.com在Rubular中测试了正则表达式,并且匹配了它。

当我在我的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 个答案:

答案 0 :(得分:14)

这里不需要使用正则表达式。 Ruby有一种更可靠的方法:

# Use the URI module distributed with Ruby:

require 'uri'

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

(这个答案来自this post:)

答案 1 :(得分:10)

(我喜欢Thomas Hupkens的回答,但是对于其他人来说,我会推荐Addressable)

建议不要使用正则表达式验证网址。

使用Ruby的URI库或类似Addressable的替代品,这两者都使URL验证变得微不足道。与URI不同,Addressable也可以处理国际字符和tld。

示例用法:

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

Code Source

答案 2 :(得分:7)

您的输入(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

答案 3 :(得分:1)

试试这个。 它为我工作。
/(FTP | HTTP | HTTPS)://(\ w +:{0,1} \ W * @)(\ S +)?(:[0-9] +)(/ | /([\ w#! :?!?+ =安培;%@ - /]))/

答案 4 :(得分:0)

这将包括国际主机处理以及df.groupby("A", as_index=False).apply(lambda g: g.iloc[g.B.str.contains("A").values.argmax()]) # A B #0 1 A0 #1 2 B1 #2 3 A2 部分可选的abc.com.it

.it