1

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

<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,它具有通过变压器的能力。该文档显示了一个示例片段以删除所有空元素。

要在任何常规元素之前删除空元素,我想我可以分配一个变量来控制它何时停止删除空标签:

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
}

但是现在,要删除尾部的空元素,我应该将它倒过来迭代。但是消毒并没有给我这种能力。

有谁知道如何做到这一点,或者有人已经实施了吗?

4

1 回答 1

1

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

从自述文件:

Sanitize 是一个基于白名单的 HTML sanitizer。给定一个可接受元素和属性的列表,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>
于 2013-07-05T06:28:02.037 回答