2017-01-31 52 views
-2

HTML將HTML轉換成在ROR文字

<p>Hello</p> 
<p>this is <br></p> 
<p>a <br></p> 
<p>test message</p><br> 

我已經嘗試 '帶標籤',這給了我下面的輸出: 「Hellothis是一封測試郵件」

輸出I想:

Hello 

this is 

a 

test message 
+2

字符串後使用html_safe。 –

+0

試圖讓它返回相同的字符串!我想要一個文本,同時去除HTML,並在新行上顯示段落 – Dom

+0

你的問題是什麼? – sawa

回答

2
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

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

感謝您的回覆!我想你的上述方案,遺憾的是它不給我所需要的輸出,這個HTML字符串「

Heelo

一個

測試

消息
」我得到的輸出「Heelothisis一個測試消息」 – Dom

+0

準確的結果是什麼? –

+0

請編輯您的問題。 –

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影響,這些文本不一定會翻譯爲文本,尤其是純文本。