the*_*Man 10
ERB url_encode可以调整:
def url_encode(s)
s.to_s.dup.force_encoding("ASCII-8BIT").gsub(%r[^a-zA-Z0-9_\-.]/) {
sprintf("%%%02X", $&.unpack("C")[0])
}
end
Run Code Online (Sandbox Code Playgroud)
至:
def url_encode(s, regex=%r[^a-zA-Z0-9_\-.]/)
s.to_s.dup.force_encoding("ASCII-8BIT").gsub(regex) {
sprintf("%%%02X", $&.unpack("C")[0])
}
end
url_encode('pop', /./)
=> "%70%6F%70"
Run Code Online (Sandbox Code Playgroud)
此外,Ruby的CGI和URI模块能够编码URL,将受限制的字符转换为实体,因此不要忽视它们的产品.
例如,转义URL参数的字符:
CGI.escape('http://www.example.com')
=> "http%3A%2F%2Fwww.example.com"
CGI.escape('<body><p>foo</p></body>')
=> "%3Cbody%3E%3Cp%3Efoo%3C%2Fp%3E%3C%2Fbody%3E"
Run Code Online (Sandbox Code Playgroud)
Ruby CGI escape还使用一个小的正则表达式来确定哪些字符应该在URL中转义.这是文档中方法的定义:
def CGI::escape(string)
string.gsub(%r([^ a-zA-Z0-9_.-]+)/) do
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
end.tr(' ', '+')
end
Run Code Online (Sandbox Code Playgroud)
您还可以覆盖它并更改正则表达式,或者在重新定义方法时将其公开以供自己使用:
def CGI::escape(string, escape_regex=%r([^ a-zA-Z0-9_.-]+)/)
string.gsub(escape_regex) do
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
end.tr(' ', '+')
end
Run Code Online (Sandbox Code Playgroud)
URI.encode_www_form_component也做类似的编码,以字符的唯一差别是*与:
URI.encode_www_form_component('<p>foo</p>')
=> "%3Cp%3Efoo%3C%2Fp%3E"
Run Code Online (Sandbox Code Playgroud)
And, similarly to overriding CGI::escape,您可以覆盖正则表达式URI.encode_www_form_component:
def self.encode_www_form_component(str, regex=%r[^*\-.0-9A-Z_a-z]/)
str = str.to_s
if HTML5ASCIIINCOMPAT.include?(str.encoding)
str = str.encode(Encoding::UTF_8)
else
str = str.dup
end
str.force_encoding(Encoding::ASCII_8BIT)
str.gsub!(regex, TBLENCWWWCOMP_)
str.force_encoding(Encoding::US_ASCII)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3431 次 |
| 最近记录: |