Nokogiri破坏了Erb标记

时间:2012-05-25 07:39:21

标签: ruby nokogiri erb

我正在使用Nokogiri在我的Sinatra,Ruby应用程序中进行一些页面处理。

所以当我这样做时:

require 'nokogiri'
s='<a href="<%=@prevHref%>">a</a>'
doc = Nokogiri::HTML.fragment(s)
puts doc.to_s

我得到了

<a href="%5C&lt;%=@prevHref%%5C&gt;">a</a>

代码已转义。我该如何避免这种情况?实际上我正在做的是:

  1. 在磁盘上打开模板
  2. 用Nokogiri解析它
  3. 替换一些节点(不是那些被转义的节点;其他一些节点)
  4. 将模板保存回磁盘
  5. 使用ERB解析模板,因为ERB标记被破坏,显然会失败。

2 个答案:

答案 0 :(得分:2)

在使用Nokogiri进行解析之前,必须先通过erb运行s字符串。否则你正确地做到了。

答案 1 :(得分:0)

如本页其他地方所述,Nokogiri(更准确地说是libxml2)无法在内部表示Erb。例如,考虑这个生成值HTML输出的有效Erb模板:

<p<%="> Hello"%> World!<%="</p"%>>

如果你仔细想想,你会发现期望Nokogiri能够创造一个DOM是不合理的。

您需要使用使用有效标记的模板语言,而不是使用Erb(无法解析为HTML或XML)。例如:

  • Amrita - 采用有效的X / HTML并与Ruby数据结构相结合,以生成HTML输出。
  • Kwartz - 采用有效的X / HTML并与类似CSS的数据绑定文件结合生成Erb模板。