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