2011-12-23 44 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訪問,但它們被剝離。這有可能在各種情況下引發問題。

相關問題