2010-11-10 49 views
7

Tôi đang cố gắng viết một phương thức giống như mysqli_real_escape_string trong PHP. Phải mất một chuỗi và thoát khỏi bất kỳ ký tự 'nguy hiểm' nào. Tôi đã tìm một phương pháp mà sẽ làm điều này cho tôi nhưng tôi không thể tìm thấy một. Vì vậy, tôi đang cố gắng để viết một mình.Ruby: Thoát các ký tự đặc biệt trong một chuỗi

Đây là những gì tôi có cho đến nay (Tôi đã thử nghiệm mô hình tại Rubular.com và nó làm việc):

# Finds the following characters and escapes them by preceding them with a backslash. Characters: ' " . */\ - 
def escape_characters_in_string(string) 
    pattern = %r{ (\'|\"|\.|\*|\/|\-|\\) } 
    string.gsub(pattern, '\\\0') # <-- Trying to take the currently found match and add a \ before it I have no idea how to do that). 
end 

Và tôi đang sử dụng start_string như chuỗi Tôi muốn thay đổi, và correct_string như những gì tôi muốn start_string biến thành:

start_string = %("My" 'name' *is* -john- .doe. /ok?/ C:\\Drive) 
correct_string = %(\"My\" \'name\' \*is\* \-john\- \.doe\. \/ok?\/ C:\\\\Drive) 

Can ai đó cố gắng và giúp tôi xác định lý do tại sao tôi không nhận được kết quả mong muốn của tôi (correct_string) hoặc cho tôi biết nơi tôi có thể tìm thấy một phương pháp mà thực hiện điều này, hoặc thậm chí nói với m tốt hơn e cả hai? Cảm ơn rất nhiều!

+0

Vì vậy, bạn đặt 'start_string' vào' escape_characters_in_string' và bạn không có được những gì bạn' đang mong đợi? Sản lượng không chính xác đó là gì? Bạn đã cho chúng tôi những gì bạn mong đợi để xem, bây giờ hãy sử dụng những gì bạn thực sự thấy ... – masher

+0

Khi tôi 'đặt' kết quả của' escape_characters_in_string (start_string) ', không có gì thay đổi; nó in ra nội dung của 'start_string' – agentbanks217

+0

Regexp.escape (str) –

Trả lời

9

mẫu isn của bạn Không được định nghĩa đúng trong ví dụ của bạn. Điều này là gần như tôi có thể nhận được để sản lượng mong muốn của bạn.

Output

"\\\"My\\\" \\'name\\' \\*is\\* \\-john\\- \\.doe\\. \\/ok?\\/ C:\\\\Drive" 

Nó sẽ mất một số tinh chỉnh từ phía bạn để làm cho nó 100% nhưng ít nhất bạn có thể thấy mô hình của bạn trong hành động ngay bây giờ.

def self.escape_characters_in_string(string) 
    pattern = /(\'|\"|\.|\*|\/|\-|\\)/ 
    string.gsub(pattern){|match|"\\" + match} # <-- Trying to take the currently found match and add a \ before it I have no idea how to do that). 
    end 
+0

Điều này đã làm được! Cảm ơn rất nhiều! – agentbanks217

+0

Rất vui khi nó hoạt động cho bạn. – rwilliams

0

Hãy xem escape_string/phương pháp trích dẫn trong lớp Mysql here

2

Điều này sẽ giúp bạn bắt đầu:

print %("'*-.).gsub(/["'*.-]/){ |s| '\\' + s } 
\"\'\*\-\. 
3

Tôi đã thay đổi trên chức năng như thế này:

def self.escape_characters_in_string(string) 
    pattern = /(\'|\"|\.|\*|\/|\-|\\|\)|\$|\+|\(|\^|\?|\!|\~|\`)/ 
    string.gsub(pattern){|match|"\\" + match} 
    end 

này đang làm việc tuyệt vời cho regex

+0

Làm nguội vỏ của nó tất cả các ký tự đặc biệt .... –

Các vấn đề liên quan