gpt4 book ai didi

ruby - 清理 gem(和丝瓜络)在标签内前导冒号之前删除文本

转载 作者:数据小太阳 更新时间:2023-10-29 07:36:30 25 4
gpt4 key购买 nike

当我注意到像“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&#58;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 中是否可能存在问题(这是这两个 gems 的基础?)

编辑 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")]
})]
})

将尝试继续挖掘,但欢迎提出任何建议。

最佳答案

我认为这是 Nokogiri 中的回归错误。我能够重现您的问题,并尝试使用多个版本的 Nokogiri。

它在 1.5.0 中正常工作:

jruby-1.6.7.2 :002 > gem 'nokogiri', '=1.5.0'
=> true
jruby-1.6.7.2 :003 > require 'nokogiri'
=> true
jruby-1.6.7.2 :004 > doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #<Nokogiri::HTML::DocumentFragment:0x7d4 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x7d2 name="span" children=[#<Nokogiri::XML::Text:0x7d0 "3:30pm">]>]>

它在 1.5.1 中失败了:

jruby-1.6.7.2 :002 > gem 'nokogiri', '=1.5.1'
=> true
jruby-1.6.7.2 :003 > require 'nokogiri'
=> true
jruby-1.6.7.2 :004 > doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #<Nokogiri::HTML::DocumentFragment:0x7d4 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x7d2 name="span" children=[#<Nokogiri::XML::Text:0x7d0 "30pm">]>]>

编辑:重要的是要注意 Nokogiri 是围绕令人敬畏的 libxml2 构建的C 库在特性、速度和处理格式错误的标记的能力方面确实无与伦比。 JRuby 实现是尝试使用 Xerces 来匹配它和 NekoHTML .我认为他们做得非常出色,使得 JRuby 实现几乎完全匹配其 MRI 对应的功能(如果不是速度的话),掩盖了截然不同的实现之间的差异。话虽这么说,但仍然会不时出现边缘情况。

我继续提交了 bug report在 Nokogiri 上。

关于ruby - 清理 gem(和丝瓜络)在标签内前导冒号之前删除文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com