我在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>
之间的所有内容。不改变字符串的其余部分。
答案 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>"]