Ruby - 使用Regex从字符串中删除所有HTML标记

时间:2017-12-21 15:34:06

标签: ruby-on-rails ruby regex format gsub

我有以下字符串作为示例

"<p>Hello,</p><p><br></p><p>my name is Same</p><p><br></p><p><br></p><p>Farewell,</p><p>Same</p>"

我想从中删除所有HTML标记。我正在使用以下哪种方法工作

Nokogiri::HTML(CGI.unescapeHTML(@message_preview)).content

但最终产生了,

"Hello,my name is SameFarewell,Same"

我想要的时候

"Hello, my name is Same Farewell, Same"

注意空格,给定换行符,我希望它的位置有一个空格而不是字符串中的下一个字符。

我希望尝试使用gsub或正则表达式,但我对如何实现它有点迷失。

3 个答案:

答案 0 :(得分:2)

不幸的是,Nokogiri::XML::Node#traverse在没有给出块的情况下不返回枚举器,这就是为什么我们需要这个丑陋的黑客来预先定义局部变量。

require 'nokogiri'

result, input = [], "<p>Hello,</p><p><br></p><p>my name is Same</p>" \
                    "<p><br></p><p><br></p><p>Farewell,</p><p>Same</p>"
Nokogiri::HTML(CGI.unescapeHTML(input)).traverse do |e|
  result << e.text if e.text?
end
result.join(' ')
#⇒ "Hello, my name is Same Farewell, Same"

答案 1 :(得分:2)

你可以在这里使用split传递适用于你的例子的正则表达式(s是你的字符串)。

def wordy s
  s.split(/\<.*?\>/)
   .map(&:strip)
   .reject(&:empty?)
   .join(' ')
   .gsub(/\s,/,',')
end

s = "<p>Hello,</p><p><br></p><p>my name is Same</p><p><br></p><p><br></p><p>Farewell,</p><p>Same</p>"
t = "<p>Hello <strong>Jim</strong>,</p><p> </p><p>This is <em>Charlie</em> and<u> I wanted to say</u></p><ol><li>hello</li><li>goodby</li></ol><p> </p><p>Farewell,</p><p>Lawrence</p>"

p wordy s
#"Hello, my name is Same Farewell, Same"

p wordy t
#"Hello Jim, This is Charlie and I wanted to say hello goodby Farewell, Lawrence"

答案 2 :(得分:0)

我的决定

description.gsub!(/<("[^"]*"|'[^']*'|[^'">])*>/, ' ').strip