6

在 Ruby 中,我有:

require 'uri'
foo = "et tu, brutus?"
bar = URI.encode(foo)      # => "et%20tu,%20brutus?"

我试图让 bar 等于 "et%20tu,%20brutus%3f" ("?" 替换为 "%3F") 当我尝试添加这个时:

bar["?"] = "%3f"

这 ”?” 匹配一切,我得到

=> "%3f"

我试过了

bar["\?"]
bar['?']
bar["/[?]"]
bar["/[\?]"]

还有一些其他的东西,它们都不起作用。

4

5 回答 5

12

require 'cgi'并打电话CGI.escape

于 2009-02-13T18:37:22.997 回答
4

这是一个示例 irb 会话:

irb(main):001:0> x = "geo?"

=> "geo?"

irb(main):002:0> x.sub!("?","a")

=> "geoa"

irb(main):003:0> 

但是, sub 只会替换第一个字符。如果要替换字符串中的所有问号,请使用如下gsub方法:

str.gsub!("?","replacement")
于 2009-02-13T18:33:00.853 回答
4

现在在 Ruby 中只有一种好方法可以做到这一点:

require "addressable/uri"
Addressable::URI.encode_component(
  "et tu, brutus?",
  Addressable::URI::CharacterClasses::PATH
)
# => "et%20tu,%20brutus%3F"

但是,如果您正在使用 URI 进行操作,那么无论如何您都应该使用Addressable

sudo gem install addressable
于 2009-05-23T20:42:09.587 回答
0

如果您知道接受哪些字符,则可以删除不匹配的字符。

accepted_chars = 'A-z0-9\s,'
foo = "et tu, brutus?"
bar = foo.gsub(/[^#{accepted_chars}]/, '')
于 2017-11-28T13:19:10.380 回答
0

URI.escape接受可选参数来告诉您要转义哪些字符。它会覆盖默认值,因此您必须调用它两次。

> URI.escape URI.escape("et tu, brutus?"), "?"
=> "et%20tu,%20brutus%3F"
于 2021-06-23T00:04:21.697 回答