2011-12-23 16 views

回答

1

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访问,但它们被剥离。这有可能在各种情况下引发问题。

相关问题