2016-05-24 32 views
0

我正在使用Ruby 2.3.1p112,我試圖使用字符串插值來生成圖像鏈接。但是,它錯誤地轉義了鏈接src引號,如下所示:src = \「http://localhost:3000/t \」。示例如下所示:Ruby字符串插值將圖像添加到鏈接前綴斜槓圖像src

<a href=www.google.com target='_blank'> google.com \"<img src=\"http://localhost:3000/t\" width='1' height='1'>\"</a> 

這不是視圖代碼;它發生在後端,這裏是類提取出來並簡化了顯示問題

class Link 
    require 'uri' 

    def self.link_name(url) 
    uri = URI.parse(url) 
    uri = URI.parse("http://#{url}") if uri.scheme.nil? 
    host = uri.host.downcase 
    host.start_with?('www.') ? host[4..-1] : host 
    end 

    def self.url_regex 
    /(http:|www.)[a-zA-Z0-9\/:\.\?]*/ 
    end 

    def self.link_image(e) 
    email = ['[email protected]', '[email protected]'] 
     email.map do |p| 
     token = new.generate_email_click_tracking_img 
     e.gsub(url_regex) do |url| 

     puts "token inloop is <a href=#{url}>#{link_name(url)} #{token} </a>" 

     "<a href=#{url} target='_blank'> #{link_name(url)} \"#{token}\"</a>" 
     end 
    end 
    end 

    def generate_email_click_tracking_img 
    url = "http://localhost:3000/t" 
    "<img src=\"#{url}\" width='1' height='1'>" 
    end 

end 

您可以通過在IRB運行下面的代碼重現:

a = "me in www.google.com, you in http://www.facebook.com" 
Link.link_image(a) 

如果你運行上面的代碼,你將看到提出聲明登錄正確的事和圖片src是:

<a href=http://www.facebook.com>facebook.com <img src="http://localhost:3000/t" width='1' height='1'> </a> 

但是,如果沒有賣出期權聲明日Ë圖片src周圍是轉義引號:HTTP://本地主機:3000 /噸\」

<a href=http://www.facebook.com target='_blank'> facebook.com \"<img src=\"http://localhost:3000/t\" width='1' height='1'>\"</a> 

什麼是去除報價在圖像SRC逃逸的最佳方式?

+0

隨着「斜線前綴」你的意思是「反斜線後綴」? – Stefan

回答

2

沒有反斜槓。你的代碼工作得很好。

您可以通過在IRB

運行下面的代碼重現它嘗試在irb運行以下命令:

puts '"hello"' 
# => "hello" 
'"hello"' 
# => "\"hello\"" 

所有你看到的是,當直接輸出變量,irb是顯示原始字符串。而且,由於字符串以"字符結尾,因此必須在顯示時轉義輸出內的任何"字符。

如果字符串真的包含文字反斜線,你會看到,而不是

<a href=http://www.facebook.com target='_blank'> facebook.com \"<img src=\"http://localhost:3000/t\" width='1' height='1'>\"</a> 

是:

<a href=http://www.facebook.com target='_blank'> facebook.com \\\"<img src=\\\"http://localhost:3000/t\\\" width='1' height='1'>\\\"</a>