从两个序列之间的字符串中删除所有内容

时间:2016-01-28 16:08:09

标签: ruby-on-rails ruby regex string

我在Rails中有一个包含HTML的字符串。例如,

<p>01/28/2016 Green RED Horse!!123 456</p>
<a href="http://greenredhorse.com" style="margin-left:283px;margin-
top:50px;margin-bottom:150px;overflow:auto;position:absolute;">
<img alt="Logo" src="http://greenredhorse.com/images/icons/logo.png" 
style="width:266px" /> </a>
<p>01/28/2017 RED Horse!!123 456</p>

如何从字符串中删除链接标记及其开头和结尾之间的所有内容?

最终结果应如下所示。

<p>01/28/2016 Green RED Horse!!123 456</p>
<p>01/28/2017 RED Horse!!123 456</p>

简而言之:如何删除<a</a>之间的所有内容。不改变字符串的其余部分。

3 个答案:

答案 0 :(得分:3)

更新:比下面的旧版更好的正则表达式。

string = <<HTML
<a-tag atr="attr">hi<a>atag</a></a-tag>
<a sdf="</a>"> hola</ a>
HTML
pattern = /<a(?:\s*>|\s+(?:(?:[^=\s]*?(?:=(?:(?:"[^"]*?")|(?:'[^']*?')))?)\s*)*>).*?<\/\s*a>/mi

string.gsub!(pattern, '')
puts string #=> <a-tag atr="attr">hi</a-tag>

旧答案

这样的假设html是您要解析的字符串

html.gsub! /<a\s?.+?a>/m, ''

如果您拥有与您发布的数据类似的小数据集,则可以使用此选项。如果您想要更强大且无错误的解决方案,可以使用nokogiri,请查看 the Tin Man 的答案。

答案 1 :(得分:3)

我不会使用正则表达式。正则表达式可能有效,但是当HTML布局发生变化时,它们的破坏几率非常高。

相反,我会使用:

require 'nokogiri'

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT)
<p>01/28/2016 Green RED Horse!!123 456</p>
<a href="http://greenredhorse.com" style="margin-left:283px;margin-
top:50px;margin-bottom:150px;overflow:auto;position:absolute;">
<img alt="Logo" src="http://greenredhorse.com/images/icons/logo.png" 
style="width:266px" /> </a>
<p>01/28/2017 RED Horse!!123 456</p>
EOT

doc.at('a').remove

puts doc.to_html
# >> <p>01/28/2016 Green RED Horse!!123 456</p>
# >> 
# >> <p>01/28/2017 RED Horse!!123 456</p>

这是使用at,这意味着“找到所需选择器的第一个匹配项”。 'a'是一个CSS选择器。

Nokogiri是Ruby中HTML / XML解析的事实标准。如果您要定期使用XML / HTML,那么学习使用它是非常值得的。

答案 2 :(得分:2)

您可以使用XPath查找感兴趣的元素。

require 'rexml/document'
include REXML

snippet = <<-eos
<p>01/28/2016 Green RED Horse!!123 456</p>
<a href="http://greenredhorse.com" style="margin-left:283px;margin-
top:50px;margin-bottom:150px;overflow:auto;position:absolute;">
<img alt="Logo" src="http://greenredhorse.com/images/icons/logo.png" 
style="width:266px" /> </a>
<p>01/28/2017 RED Horse!!123 456</p>
eos

well_formed_snippet = "<html>#{snippet}</html>"

xmldoc = Document.new(well_formed_snippet)
p XPath.match(xmldoc, "//p").map(&:to_s)
#=> ["<p>01/28/2016 Green RED Horse!!123 456</p>", "<p>01/28/2017 RED Horse!!123 456</p>"]