如何避免Nokogiri编码href内容?

Jua*_*nti 3 ruby nokogiri

我有这个代码:

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

当我这样做时n.to_html,我得到了{{ }}逃脱:

"<a href=\"%7B%7Bvar_name%7D%7D\">click</a>"
Run Code Online (Sandbox Code Playgroud)

我想避免这种情况,因为我需要使用模板引擎解析它.

我怎么能告诉Nokogiri不要编码"href"内容?

the*_*Man 6

我认为不可能告诉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>"
Run Code Online (Sandbox Code Playgroud)

但是,如果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>"
Run Code Online (Sandbox Code Playgroud)