2014-12-03 44 views
2

我有這樣的代碼:如何避免Nokogiri編碼href內容?

n = Nokogiri::HTML::DocumentFragment.parse("<a href='{{var_name}}'>click</a>") 

當我做n.to_html,我得到{{ }}轉義:

"<a href=\"%7B%7Bvar_name%7D%7D\">click</a>" 

我想避免這種情況,因爲我需要一個模板引擎解析它。

我該如何告訴Nokogiri不要編碼「href」內容?

回答

5

我不認爲有可能告訴Nokogiri 而不是在HTML中的參數內編碼文本值。這是下面的規則解析器,但這並不意味着我們必須接受它的輸出:

require 'nokogiri' 

REGEX_HASH = { 
    '%7B' => '{', 
    '%7D' => '}' 
} 

REGEX = /(?:#{ Regexp.union(REGEX_HASH.keys).source })/ 
# => /(?:%7B|%7D)/ 

doc = Nokogiri::HTML::DocumentFragment.parse("<a href='{{var_name}}'>click</a>") 
doc.to_html 
# => "<a href=\"%7B%7Bvar_name%7D%7D\">click</a>" 

fixed_html = doc.to_html.gsub(REGEX, REGEX_HASH) 
# => "<a href=\"{{var_name}}\">click</a>" 

但是,如果XHTML或XML輸出是可以接受的,您可以簡化事情很大:

doc = Nokogiri::HTML::DocumentFragment.parse("<a href='{{var_name}}'>click</a>") 
doc.to_html # => "<a href=\"%7B%7Bvar_name%7D%7D\">click</a>" 
doc.to_xhtml # => "<a href=\"{{var_name}}\">click</a>" 
doc.to_xml # => "<a href=\"{{var_name}}\">click</a>"