2009-02-13 12 views
6

In Ruby, ho:In Ruby, come posso sostituire il carattere punto interrogativo in una stringa?

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

Sto cercando di ottenere barre di eguagliare "et% 20tu,% 20brutus% 3f" (sostituito con "% 3F" "?") Quando provo ad aggiungere this:

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

il "?" partite tutto, e ho

=> "%3f" 

Ho provato

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

e poche altre cose, nessuno dei quali lavoro.

Suggerimenti?

Grazie!

+1

Per curiosità, hai provato 'bar [" \\? "]'? – Tim

risposta

12

require 'cgi' e chiamare CGI.escape

4

Ecco un esempio di sessione IRB:

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

=> "geo?"

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

=> "geoa"

irb(main):003:0>

Tuttavia, sub sostituirà solo il primo carattere. Se si desidera sostituire tutti i punti interrogativi in ​​una stringa, utilizzare il gsub metodo come questo:

str.gsub!("?","replacement")

+1

Grazie. Questo e CGI.escape funzionano entrambi bene. Sono andato con questo, però. (Meno richiede). – Olie

+1

@geo, anche se la tua risposta è tecnicamente corretta e, secondo Olie, dovrebbe davvero usare CGI.escape. – vladr

+1

Sì, ma in questo modo aumenta la sua conoscenza della lingua. – Geo

3

C'è solo un buon modo per fare questo in questo momento in Ruby:

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

Ma se si sta facendo cose con URI si dovrebbe davvero essere utilizzando Addressable comunque.

sudo gem install addressable 
0

Se si conoscono i caratteri accettati, è possibile rimuovere quelli che non corrispondono.

accepted_chars = 'A-z0-9\s,' 
foo = "et tu, brutus?" 
bar = foo.gsub(/[^#{accepted_chars}]/, '')