当我注意到像“6:30pm”这样的时间变成“30pm”时,在尝试清理一些 html 片段时遇到了 Loofah 和 Sanitize 的一些奇怪行为。
做了一些调查,发现如下:
Loofah.scrub_fragment("<span>asdfasdf 6:30 pm</span>", :strip).to_html
#=> "<span>asdfasdf 30 pm</span>"
Loofah.scrub_fragment("6:30 pm", :strip).to_html
#=> "6:30 pm"
Loofah.scrub_fragment("<foo>asdfasdf 6:30 pm</foo>", :strip).to_html
#=> "asdfasdf 6:30 pm"
Loofah.scrub_fragment("bar:30 pm", :strip).to_html
#=> "bar:30 pm"
Loofah.scrub_fragment("<span>bar:30 pm</span>", :strip).to_html
#=> "<span>30 pm</span>"
Loofah.scrub_fragment("<span>bar: asdfasdfadsf pm</span>", :strip).to_html
#=> "<span>bar: asdfasdfadsf pm</span>"
Loofah (:prune 等) 和 Sanitize 的所有变体都是这种情况,所以我假设这是它们共同的代码问题。在清理之前,我需要做些什么来转义代码中的冒号吗?
编辑 1 我意识到我没有提到我正在使用 jruby ( jruby 1.7.0 (1.9.3p203) )。我试图弄清楚 nokogiri 是否可能存在问题(这两个宝石的基础是什么?)
编辑 2 通过进一步挖掘,看起来可能是 Jruby 上的 Nokogiri 中的一个问题(我使用的是 nokagiri 的 1.5.5 版,因为这很有价值)。我在 Jruby 和 Ruby 1.9.3 上检查了 nokogiri 的片段解析器:
Jruby 1.7.0:意外结果
doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #(DocumentFragment:0x5fbc {
name = "#document-fragment",
children = [
#(Element:0x5fc0 { name = "span", children = [ #(Text "30pm")] })]
})
Ruby 1.9.3:预期结果
doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #(DocumentFragment:0x3fc4b102055c {
name = "#document-fragment",
children = [
#(Element:0x3fc4b101fff8 {
name = "span",
children = [ #(Text "3:30pm")]
})]
})
将尝试继续挖掘,但欢迎提出任何建议。