URI
module URI
Included modules:URI::REGEXP
URI是提供处理统一资源标识符(RFC2396)的类的模块,
特征
- 统一处理URI的处理
- 灵活引入自定义URI方案
- 灵活地有一个可选的URI :: Parser(或者只是不同的模式和正则表达式)基本示例需要'uri'
- RFC3986Class tree
- URI::Generic (in uri/generic.rb)
- [URI::FTP](uri/ftp) - (in uri/ftp.rb)
- [URI::HTTP](uri/http) - (in uri/http.rb)
- [URI::HTTPS](uri/https) - (in uri/https.rb)
- [URI::LDAP](uri/ldap) - (in uri/ldap.rb)
- [URI::LDAPS](uri/ldaps) - (in uri/ldaps.rb)
- [URI::MailTo](uri/mailto) - (in uri/mailto.rb)
- URI::Parser - (in uri/common.rb)
- URI::REGEXP - (in uri/common.rb)
- URI::REGEXP::PATTERN - (in uri/common.rb)URI::Util - (in uri/common.rb)
- URI::Escape - (in uri/common.rb)
- URI::Error - (in uri/common.rb)
- [URI::InvalidURIError](uri/invalidurierror) - (in uri/common.rb)
- [URI::InvalidComponentError](uri/invalidcomponenterror) - (in uri/common.rb)
- [URI::BadURIError](uri/badurierror) - (in uri/common.rb)
版权信息
$Id: uri.rb 53141 2015-12-16 05:07:31Z naruse $
常量
DEFAULT_PARSER
URI::Parser.new
Parser REGEXP RFC3986_PARSER
公共类别方法
decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false) Show source
解码给定的URL编码表单数据str
。
这解码application/x-www-form-urlencoded数据并返回键值数组的数组。
ary = URI.decode_www_form("a=1&a=2&b=3")
p ary #=> [['a', '1'], ['a', '2'], ['b', '3']]
p ary.assoc('a').last #=> '1'
p ary.assoc('b').last #=> '3'
p ary.rassoc('a').last #=> '2'
p Hash[ary] # => {"a"=>"2", "b"=>"3"}
See ::decode_www_form_component, ::encode_www_form
# File lib/uri/common.rb, line 453
def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
ary = []
return ary if str.empty?
enc = Encoding.find(enc)
str.b.each_line(separator) do |string|
string.chomp!(separator)
key, sep, val = string.partition('=')
if isindex
if sep.empty?
val = key
key = ''
end
isindex = false
end
if use__charset_ and key == '_charset_' and e = get_encoding(val)
enc = e
use__charset_ = false
end
key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
if val
val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
else
val = ''
end
ary << [key, val]
end
ary.each do |k, v|
k.force_encoding(enc)
k.scrub!
v.force_encoding(enc)
v.scrub!
end
ary
end
decode_www_form_component(str, enc=Encoding::UTF_8) Show source
给定str
URL编码表单数据的解码。
这解码+到SP。
See ::encode_www_form_component, ::decode_www_form
# File lib/uri/common.rb, line 385
def self.decode_www_form_component(str, enc=Encoding::UTF_8)
raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/ =~ str
str.b.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
end
encode_www_form(enum, enc=nil) Show source
从给定enum
生成URL编码的表单数据。
这将从给定的Enumerable对象生成HTML5中定义的application / x-www-form-urlencoded数据。
这在内部使用::encode_www_form_component。
此方法不会转换给定项目的编码,因此如果您希望以非原始编码或混合编码数据发送数据,请在调用此方法之前转换它们。(以HTML5 ASCII不兼容编码编码的字符串转换为UTF-8。)
This method doesn't handle files. When you send a file, use multipart/form-data.
URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => "ruby", "lang" => "en")
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
#=> "q=ruby&q=perl&lang=en"
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
#=> "q=ruby&q=perl&lang=en"
See ::encode_www_form_component, ::decode_www_form
# File lib/uri/common.rb, line 417
def self.encode_www_form(enum, enc=nil)
enum.map do |k,v|
if v.nil?
encode_www_form_component(k, enc)
elsif v.respond_to?(:to_ary)
v.to_ary.map do |w|
str = encode_www_form_component(k, enc)
unless w.nil?
str << '='
str << encode_www_form_component(w, enc)
end
end.join('&')
else
str = encode_www_form_component(k, enc)
str << '='
str << encode_www_form_component(v, enc)
end
end.join('&')
end
encode_www_form_component(str, enc=nil) Show source
编码给str
URL0编码的表单数据。
此方法不转换*, -, ., 0-9, AZ, _, az,但将SP(ASCII空间)转换为+并将其他转换为%XX。
如果enc
给出,则str
在编码百分比前转换为编码。
See ::decode_www_form_component, ::encode_www_form
# File lib/uri/common.rb, line 367
def self.encode_www_form_component(str, enc=nil)
str = str.to_s.dup
if str.encoding != Encoding::ASCII_8BIT
if enc && enc != Encoding::ASCII_8BIT
str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
str.encode!(enc, fallback: ->(x){"&#{x.ord};"})
end
str.force_encoding(Encoding::ASCII_8BIT)
end
str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_)
str.force_encoding(Encoding::US_ASCII)
end
extract(str, schemes = nil, &block) Show source
概要
URI::extract(str[, schemes][,&blk])
Args
str
从中提取URI的字符串。
schemes
将URI匹配限制为特定方案。
描述
从字符串中提取URI。如果给出的块,遍历所有匹配的URI。如果给定块或匹配数组,则返回nil。
Usage
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
# => ["http://foo.example.com/bla", "mailto:test@example.com"]
# File lib/uri/common.rb, line 295
def self.extract(str, schemes = nil, &block)
warn "#{caller(1)[0]}: warning: URI.extract is obsolete" if $VERBOSE
DEFAULT_PARSER.extract(str, schemes, &block)
end
join(*str) Show source
概要
URI::join(str[, str, ...])
Args
str
在合并之前,要使用的字符串将被转换为RFC3986 URI。
描述
加入URI。
用法
require 'uri'
p URI.join("http://example.com/","main.rbx")
# => #<URI::HTTP:0x2022ac02 URL:http://example.com/main.rbx>
p URI.join('http://example.com', 'foo')
# => #<URI::HTTP:0x01ab80a0 URL:http://example.com/foo>
p URI.join('http://example.com', '/foo', '/bar')
# => #<URI::HTTP:0x01aaf0b0 URL:http://example.com/bar>
p URI.join('http://example.com', '/foo', 'bar')
# => #<URI::HTTP:0x801a92af0 URL:http://example.com/bar>
p URI.join('http://example.com', '/foo/', 'bar')
# => #<URI::HTTP:0x80135a3a0 URL:http://example.com/foo/bar>
# File lib/uri/common.rb, line 267
def self.join(*str)
RFC3986_PARSER.join(*str)
end
parse(uri) Show source
概要
URI::parse(uri_str)
Args
uri_str
带URI的字符串。
描述
从字符串中创建一个URI的子类实例。
Raises
URI::InvalidURIError
Raised if URI given is not a correct one.
用法
require 'uri'
uri = URI.parse("http://www.ruby-lang.org/")
p uri
# => #<URI::HTTP:0x202281be URL:http://www.ruby-lang.org/>
p uri.scheme
# => "http"
p uri.host
# => "www.ruby-lang.org"
uri_str
如果有任何无效的URI字符,建议首先uri_str
::提供所提供的内容。
# File lib/uri/common.rb, line 229
def self.parse(uri)
RFC3986_PARSER.parse(uri)
end
regexp(schemes = nil) Show source
概要
URI::regexp([match_schemes])
Args
match_schemes
一系列计划。如果给定,那么导致正则表达式匹配其方案是match_schemes之一的URI。
描述
返回一个匹配类似URI的字符串的Regexp对象。此方法返回的Regexp对象包含任意数量的捕获组(括号)。永远不要依赖它的号码。
用法
require 'uri'
# extract first URI from html_string
html_string.slice(URI.regexp)
# remove ftp URIs
html_string.sub(URI.regexp(['ftp'])
# You should not rely on the number of parentheses
html_string.scan(URI.regexp) do |*matches|
p $&
end
# File lib/uri/common.rb, line 331
def self.regexp(schemes = nil)
warn "#{caller(1)[0]}: warning: URI.regexp is obsolete" if $VERBOSE
DEFAULT_PARSER.make_regexp(schemes)
end
scheme_list() Show source
返回已定义方案的哈希值
# File lib/uri/common.rb, line 139
def self.scheme_list
@@schemes
end
split(uri) Show source
概要
URI::split(uri)
Args
uri
带URI的字符串。
描述
将字符串拆分为以下几部分,并返回带有结果的数组:
* Scheme
* Userinfo
* Host
* Port
* Registry
* Path
* Opaque
* Query
* Fragment
用法
require 'uri'
p URI.split("http://www.ruby-lang.org/")
# => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
# File lib/uri/common.rb, line 191
def self.split(uri)
RFC3986_PARSER.split(uri)
end