我需要在文本/内容的最后一个标记之上和之后修剪空格。我想控制显示给客户端的内容,而不是“破坏”视觉效果。
<p> <br> </p> ~> remove
<p> <br> </p> ~> remove
<p> Text <p>
<p> <br> </p> ~> should preserve only this of the empty tags
<p> Text </p>
<p> Text </p>
<p> <br> </p> ~> remove
<p> <br> </p> ~> remove
<p> <br> </p> ~> remove
我正在使用Sanitize,它有能力传递变形金刚。该文档显示了example snippet以删除所有空元素。
要删除任何常规元素之前的空元素,我想我可以指定一个变量来控制何时停止删除空标记:
should_remove_empty = true
lambda {|env|
node = env[:node]
return unless node.elem?
unless node.children.any?{|c| c.text? && c.content.strip.length > 0 || !c.text? }
node.unlink if should_remove_empty
else
should_remove_empty = false
end
}
但是现在,为了删除尾部空元素,我应该颠倒它。但Sanitize并没有给我这种能力。
有谁知道如何做到这一点,还是有人已经实现了它?
答案 0 :(得分:1)
来自自述文件:
Sanitize是一个基于白名单的HTML清理程序。给出一份清单 可接受的元素和属性,Sanitize将删除所有 来自字符串的不可接受的HTML。
这对你不起作用,因为有时候你想要保留那些不可接受的元素。
require 'nokogiri'
doc = Nokogiri::HTML(<<END_OF_HTML)
<body>
<p> <br> </p>
<p> <br> </p>
<p> Text </p>
<p> <br> </p>
<p> Text </p>
<p> Text </p>
<p> <br> </p>
<p> <br> </p>
<p> <br> </p>
</body>
END_OF_HTML
ps = doc.xpath '/html/body/p'
first_text = -1
last_text = 0
ps.each_with_index do |p, i|
if not p.at_xpath('child::text()').text.strip.empty? #then found some text
first_text = i if first_text == -1
last_text = i
end
end
puts ps.slice(first_text .. last_text)
--output:--
<p> Text </p>
<p> <br></p>
<p> Text </p>
<p> Text </p>