2009-02-13 11 views
6

En Ruby, que tengo:En Ruby, ¿cómo reemplazo el carácter del signo de interrogación en una cadena?

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

Estoy intentando conseguir la barra para igualar "et 20tu%,% 20brutus% 3f" (sustituido por "% 3F" "?") Cuando intento agregar esto:

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

the "?" partidos todo, y me sale

=> "%3f" 

He intentado

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

Y algunas otras cosas, ninguno de los cuales trabajo.

¿Sugerencias?

Gracias!

+1

Por curiosidad, ¿has probado 'bar [" \\? "]'? – Tim

Respuesta

12

require 'cgi' y llame CGI.escape

4

Aquí hay una sesión de IRB muestra:

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

=> "geo?"

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

=> "geoa"

irb(main):003:0>

Sin embargo, Sub sólo reemplazará el primer carácter. Si desea reemplazar todos los signos de interrogación en una cadena, utilice el gsub método como este:

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

+1

Gracias. Esto y CGI.escape funcionan bien. Fui con este, sin embargo. (Menos requiere.) – Olie

+1

@geo, aunque su respuesta es técnicamente correcta y, para Olie, realmente debería usar CGI.escape. – vladr

+1

Sí, pero de esta manera su conocimiento del idioma aumenta. – Geo

3

Sólo hay una buena manera de hacer esto en este momento en Ruby:

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

Pero si está haciendo cosas con los URI que debe ser realmente usando Addressable de todos modos.

sudo gem install addressable 
0

Si sabe qué caracteres acepta, puede eliminar los que no coincidan.

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