2009-02-13 42 views
6

Trong Ruby, tôi có:Trong Ruby, làm cách nào để thay thế ký tự dấu chấm hỏi trong chuỗi?

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

Tôi đang cố gắng để có được thanh để bằng "et% 20tu,% 20brutus% 3F" (thay thế bằng "% 3F" "?") Khi tôi cố gắng thêm này:

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

"?" phù hợp với tất cả mọi thứ, và tôi nhận được

=> "%3f" 

Tôi đã thử

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

Và một vài điều khác, không ai trong số đó làm việc.

Gợi ý?

Cảm ơn!

+1

Ngoài sự tò mò, bạn đã thử 'bar [" \\? "]'? – Tim

Trả lời

12

require 'cgi' và gọi CGI.escape

4

Dưới đây là một phiên IRB mẫu:

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

=> "geo?"

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

=> "geoa"

irb(main):003:0>

Tuy nhiên, phụ chỉ sẽ thay thế các ký tự đầu tiên. Nếu bạn muốn thay thế tất cả các dấu chấm hỏi trong một chuỗi, sử dụng gsub phương pháp như thế này:

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

+1

Cảm ơn. Điều này và CGI.escape cả hai làm việc độc đáo. Tôi đã đi với cái này, mặc dù. (Ít yêu cầu.) – Olie

+1

@geo, mặc dù câu trả lời của bạn là chính xác về mặt kỹ thuật và theo quan điểm của Olie, anh ấy thực sự nên sử dụng CGI.escape. – vladr

+1

Có, nhưng theo cách này, kiến ​​thức của ông về ngôn ngữ tăng lên. – Geo

3

Chỉ có một cách tốt để làm này ngay bây giờ trong Ruby:

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

Nhưng nếu bạn đang làm công cụ với URI, bạn thực sự nên sử dụng Addressable anyways.

sudo gem install addressable 
0

Nếu bạn biết bạn chấp nhận ký tự nào, bạn có thể xóa những ký tự không khớp.

accepted_chars = 'A-z0-9\s,' 
foo = "et tu, brutus?" 
bar = foo.gsub(/[^#{accepted_chars}]/, '') 
Các vấn đề liên quan