0
任何一个熟悉RubyGem消毒,提供建设 “变压器” 的一个例子如何使用RubyGem Sanitize变换器将无序列表清理为逗号分隔列表?
"<ul><li>a</li><li>b</li><li>c</li></ul>"
转换成
"a,b, and c"
?
任何一个熟悉RubyGem消毒,提供建设 “变压器” 的一个例子如何使用RubyGem Sanitize变换器将无序列表清理为逗号分隔列表?
"<ul><li>a</li><li>b</li><li>c</li></ul>"
转换成
"a,b, and c"
?
IMO变压器不用于拉出这样的数据:
变形金刚让您筛选和使用自己的自定义逻辑节点修改[...]
这是不是你正在努力去做;您试图从节点中提取数据,并对其进行转换。在你的例子中,你对每个元素都没有做同样的事情:有时候会附加一个逗号,有时会附加一个逗号和单词“and”。
为了做到这一点,您需要保存状态和后处理,或者在节点流中向前看,看看您是否正在访问最后一个节点。我不知道用Sanitize的变压器做这件事的简单方法,所以这个例子保存了状态和后处理。
require 'sanitize'
items = []
s = "<ul><li>some space</li><li>more stuff with spaces</li><li>last one</li></ul>"
save_li = lambda do |env|
node = env[:node]
items << node.text.strip if node.text?
end
Sanitize.clean(s, :transformers => save_li)
# => " some space more stuff with spaces last one "
output = "#{items[0..-2].join(", ")}, and #{items[-1]}"
# => "some space, more stuff with spaces, and last one"
IMO这个例子是变压器的滥用,因为它正在运行不仅是因为它的副作用,它无非是寻找文本节点等。
如果列表项之一已嵌入HTML,天真的方法不再起作用,你需要开始了解更多引入nokogiri反正:
items = []
s = "<ul><li>some space</li><li>item <b>with<b/> html</li><li>c</li></ul>"
save_li = lambda do |env|
node = env[:node]
items << node.content if node.name == "li"
end
Sanitize.clean(s, :transformers => save_li)
# => " some space item with html c "
output = "#{items[0..-2].join(", ")}, and #{items[-1]}"
# => "some space, item with html, and c"
这种方法依赖于任何默认消毒行为被列入白名单。 标签仍然由save_li
lambda访问,但它们被剥离。这有可能在各种情况下引发问题。