如何修剪HTML中空标记的头部和尾部?

时间:2013-07-04 23:13:01

标签: ruby-on-rails ruby sanitize

我需要在文本/内容的最后一个标记之上和之后修剪空格。我想控制显示给客户端的内容,而不是“破坏”视觉效果。

<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并没有给我这种能力。

有谁知道如何做到这一点,还是有人已经实现了它?

1 个答案:

答案 0 :(得分:1)

  

我正在使用https://github.com/rgrove/sanitize

来自自述文件:

  

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>