我正在尝试使用正则表达式来验证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 }
答案 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
答案 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