【问题标题】:Replacing a %20 with a space in Ruby用 Ruby 中的空格替换 %20
【发布时间】:2012-07-22 06:44:19
【问题描述】:

我目前有一个类似于["green%20books"] 的字符串,我希望它读为["green books"]

我认为谷歌搜索会很快产生结果,但每个人都只想将空格变成%20s。反之亦然。

任何帮助将不胜感激!

编辑:

这是我正在使用的函数,我很困惑在这里解码 URL 的位置。我尝试删除 URI.encode 文本,但这破坏了功能。

def self.get_search_terms(search_url)
    hash = CGI.parse(URI.parse(URI.encode(search_url)).query) #returns a hash
    keywords = []
    hash.each do |key, value|
      if key == "q" || key == "p"
        keywords << value
      end
    end
    keywords
  end

【问题讨论】:

  • 你在使用 Rails 吗?如果是这样,params[:q] 是否不能满足您的需求?
  • 是的,我正在使用 Rails。我不确定我的字符串是不是任何东西的参数...
  • 我可以理解这里想要一个实用方法。然而,参数解析本身可能不应该是控制器——或助手——关心的事情。也许可以用Hash(例如,控制器中的params)来定义方法。
  • 这是在模型内部完成的,值得...
  • 在这种情况下,这可能是 How to extract URL parameters from a URL with Ruby or Rails? 的副本。这个问题有帮助吗?

标签: ruby arrays string


【解决方案1】:

您可以使用 URI 的“unencode”方法。 (别名为解码)

require 'uri'
URI.decode("green%20books")
# => "green books"

这不仅会用空格替换“%20”,而且会替换每个 uri 编码的字符,我认为这就是你想要的。

documentation

【讨论】:

  • URI.decodeURI.encode 已被弃用多年。请参阅@benjamin-oakes 答案。
【解决方案2】:

CGI::unescape 会做你想做的事:

1.9.2-p320 :001 > require 'cgi'
=> true 
1.9.2-p320 :002 > s = "green%20books"
=> "green%20books" 
1.9.2-p320 :003 > CGI.unescape(s)
=> "green books"

另一个选项(正如 YenTheFirst 提到的)可能是URI.decode。然而,I read a discussion that it would be deprecated——虽然那是在 2010 年。

无论如何,既然你问的是数组,你可能会map 使用那个方法:

ary.map { |s| CGI.unescape(s) }

【讨论】:

    【解决方案3】:

    你可以使用正则表达式:

    string = "green%20books"
    string.gsub!('%20', ' ')
    
    puts string
    

    【讨论】:

    • 其实不需要正则表达式:string.gsub!('%20', ' ')
    • @pguardiario 虽然请注意,在内部 gsub 无论如何都会将字符串转换为正则表达式。
    • 跟随gsub进入C源代码:str_gsubget_patrb_reg_regcomprb_reg_new_strrb_reg_init_strrb_reg_allocrb_reg_s_alloc,返回一个新的正则表达式.
    • @pguardiario:字符串参数将被正则表达式化,但它会首先被转义(使用rb_reg_quote)所以你不必担心gsub('.*').*视为正则表达式而不是一个普通的字符串。
    • @Andrew - 这很有趣,你有链接到我们可以看到的地方吗? rubinius/jruby 呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多