HTML
<p>Hello</p>
<p>this is <br></p>
<p>a <br></p>
<p>test message</p><br>
我已经尝试了'strip tags',它给出了以下输出: “Hellothis是一个测试信息”
我想要的输出:
Hello
this is
a
test message
答案 0 :(得分:3)
html = "<p>Hello</p>
<p>this is <br></p>
<p>a <br></p>
<p>test message</p><br>"
strip_tags
帮助似乎工作正常:
puts ActionController::Base.helpers.strip_tags(html)
# =>
# Hello
# this is
# a
# test message
Nokogiri
,因此您也可以使用:
doc = Nokogiri::HTML(html)
puts doc.xpath("//text()").to_s
输出:
Hello
this is
a
test message
如果您想删除换行符:
ActionController::Base.helpers.strip_tags(html).gsub(/\s+/,' ')
#=> "Hello this is a test message"
答案 1 :(得分:0)
HTML由以下浏览器呈现:
Hello
this is
a
test message
但这并不完全正确,因为HTML在<br>
标记中包含尾随<p>
标记,应该是一个字符串,如:
this is \n\n\n
通常被视为段落加上新行。但是,浏览器在渲染文本时会玩游戏,以使其更具可读性,并且会丢弃空白行和空格。例如,这个HTML:
<p>foo</p>
<p></p>
<p></p>
<p></p>
<p>bar</p>
呈现为:
foo
bar
和
<p>foo bar</p>
呈现为:
foo bar
所以,您必须决定是否要使用Nokogiri像浏览器一样呈现文本以获得可读性,还是要准确地做到?
这就像浏览器一样:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<p>Hello</p>
<p>this is <br></p>
<p>a <br></p>
<p>test message</p><br>
EOT
doc.search('br').remove
text = doc.search('p').map { |p| p.text + "\n\n" }
puts text
# >> Hello
# >>
# >> this is
# >>
# >> a
# >>
# >> test message
# >>
删除中断,然后通过附加两个新行来转换包含<p>
的文本。
根据标记显示的方式准确地做到这一点有点不同:
doc.search('br').map { |br| br.replace("\n") }
text = doc.search('p').map { |p| p.text + "\n\n" }
puts text
# >> Hello
# >>
# >> this is
# >>
# >>
# >> a
# >>
# >>
# >> test message
# >>
这只是一种简化的方法来帮助您入门。 Rails在ActionView的simple_format
方法中与此相反。
浏览器有很多规则用于确定何时以及如何显示文本,并且它们的渲染可能受到CSS和JavaScript的影响,而CSS和JavaScript不一定会翻译成文本,尤其是纯文本。