在HOR中将html转换为文本

时间:2017-01-31 11:53:27

标签: ruby-on-rails ruby ruby-on-rails-4

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

2 个答案:

答案 0 :(得分:3)

html = "<p>Hello</p>
<p>this is <br></p>
<p>a <br></p>
<p>test message</p><br>"

用strip_tags

strip_tags帮助似乎工作正常:

puts ActionController::Base.helpers.strip_tags(html)
# => 
# Hello
# this is 
# a 
# test message

引入nokogiri

Rails中默认包含

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不一定会翻译成文本,尤其是纯文本。