2016-04-21 73 views
-3

我有这样的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'>", 
'&lt;' => '<', '&gt;'=>'>','<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内容的正确方法。

+0

使用解析器,而不是HTML。 – smathy

+2

我建议你使用Nokogiri宝石。 – Ilya

+1

如果你知道这不是正确的方法,为什么呢?我并不是说这是一种冒犯,我要求澄清 - 除非你确信解析器不是正确的解决方案,这可能是你得到的唯一答案 – alexanderbird

回答

1

我不会推荐使用正则表达式,因为它们是一个死胡同,除非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的所有方面的许多不同的易于搜索的问题。