正则表达式来去除李标签和TD标签
问题描述:
我有这样的HTML内容中的p标签:正则表达式来去除李标签和TD标签
<p>This is a paragraph:</p>
<ul>
<li>
<p>point 1</p>
</li>
<li>
<p>point 2</p>
<ul>
<li>
<p>point 3</p>
</li>
<li>
<p>point 4</p>
</li>
</ul>
</li>
<li>
<p>point 5</p>
</li>
</ul>
<ul>
<li>
<p><strong>sub-head : </strong>This is a para followed by heading, This is a para followed by heading, This is a para followed by heading, This is a para followed by heading</p>
</li>
<li>
<p><strong>sub-head 2: </strong></p>
<p>This is a para followed by heading, This is a para followed by heading, This is a para followed by heading, This is a para followed by heading</p>
</li>
</ul>
我想删除所有<p> & </P >标签之间<李> & < /李>,不管其位于<li> & </li >。同样我需要删除表格内的td标签之间的p标签。
这是到目前为止我的控制器的代码:
nogo={"<li>\n<p>" =>'<li>', "</p>\n</li>" => '</li>', "<td>\n<p>" => '<td>', "</p>\n</td>" => '</td>',
'<p> </p>' => '','<ul>' => "\n<ul>",'</ul>' => "</ul>\n", '</ol>' => "</ol>\n" ,
'<table>' => "\n<table width='100%' border='0' cellspacing='0' cellpadding='0' class='table table-curved'>",
'<' => '<', '>'=>'>','<br>' => '','<p></p>' => '', ' rel="nofollow"' => ''
c=params[:content]
bundle_out=Sanitize.fragment(c,Sanitize::Config.merge(Sanitize::Config::BASIC,
:elements=> Sanitize::Config::BASIC[:elements]+['table', 'tbody', 'tr', 'td', 'h1', 'h2', 'h3'],
:attributes=>{'a' => ['href']}))#.split(" ").join(" ")
re = Regexp.new(nogo.keys.map { |x| Regexp.escape(x) }.join('|'))
@bundle_out=bundle_out.gsub(re, nogo)
IM上述html内容传递给该代码通过PARAMS [:内容]其中香港专业教育学院分配给一个变量c。
以下是不符合预期的o/p。一些接近p标签和开放p标签是李,靠近李标签
<p>This is a paragraph:</p>
<ul>
<li>point 1</li>
<li>point 2</p>
<ul>
<li>point 3</li>
<li>point 4</li>
</ul>
</li>
<li>point 5</li>
</ul>
<ul>
<li><strong>sub-head : </strong>This is a para followed by heading, This is a para followed by heading, This is a para followed by heading, This is a para followed by heading</li>
<li><strong>sub-head 2: </strong></p>
<p>This is a para followed by heading, This is a para followed by heading, This is a para followed by heading, This is a para followed by heading</li>
</ul>
之间仍然是我的目标很简单,我只是想删除内里和TD标签的所有p标签,其中即时通讯不能够正确地做。任何帮助表示赞赏。
我想用正则表达式来做到这一点。我知道使用正则表达式不是解析html内容的正确方法。
答
我不会推荐使用正则表达式,因为它们是一个死胡同,除非HTML是微不足道的,并且您创建它。而且,如果你是创建它的人,那么在生成它之后修改它是生成内容的错误方法。
使用解析器。 Nokogiri是Ruby的事实标准,并与CSS或XPath的一些知识,你可以很快学会搜索,或修改,HTML和XML:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<ul>
<li>
<p>foo</p>
</li>
<li>
<span>
<p>bar</p>
</span>
</li>
</ul>
</body>
</html>
EOT
doc.search('li p').each do |p_tag|
p_tag.remove
end
puts doc.to_html
运行的结果中:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<ul>
<li>
</li>
<li>
<span>
</span>
</li>
</ul>
</body>
</html>
Nokogiri网站上的教程是您的出发点。堆栈溢出也是一个很好的资源,因为有关使用gem的所有方面的许多不同的易于搜索的问题。
使用解析器,而不是HTML。 – smathy
我建议你使用Nokogiri宝石。 – Ilya
如果你知道这不是正确的方法,为什么呢?我并不是说这是一种冒犯,我要求澄清 - 除非你确信解析器不是正确的解决方案,这可能是你得到的唯一答案 – alexanderbird