2016-04-21 12 views
-3

Ich habe diesen HTML Inhalt zu entfernen > unabhängig von seiner Position zwischen <li> & </li >. Ähnlich muss ich p Tags zwischen td Tags innerhalb einer Tabelle entfernen.Regex zu p-Tags innerhalb von li-Tags und td-Tags

Dies ist mein Controller-Code so weit:

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 den obigen HTML-Inhalt zu diesem Code durch params passing [: Gehalt], die zu einem Variablen c zugeordnet ive.

Folgendes ist das o/p, das nicht wie erwartet ist. Einige schließen p-Tags und offene p-Tags sind immer noch zwischen li und schließen li-Tags

<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> 

Mein Ziel ist einfach Ich möchte nur alle p-Tags innerhalb li und td-Tags entfernen, die nicht in der Lage im, richtig zu tun. Jede Hilfe wird geschätzt.

Ich möchte Regex dazu verwenden. und ich weiß, dass die Verwendung von Regex nicht der richtige Weg ist, HTML-Inhalte zu parsen.

+0

Verwenden Sie einen Parser, nicht HTML. – smathy

+2

Ich empfehle Ihnen, Nokogiri gem. – Ilya

+1

Wenn Sie wissen, dass es nicht der richtige Weg ist, warum? Ich meine das nicht als Beleidigung, ich bitte um eine Klarstellung - es sei denn, Sie können sehr überzeugend sein, dass ein Parser nicht die richtige Lösung ist, die möglicherweise die einzige Antwort ist, die Sie erhalten – alexanderbird

Antwort

1

Ich werde die Verwendung von Regex nicht empfehlen, da sie eine Sackgasse sind, es sei denn, der HTML-Code ist trivial und Sie erstellen ihn. Und wenn Sie derjenige sind, der es erstellt, ist es falsch, den Inhalt zu generieren, nachdem Sie ihn erzeugt haben.

Verwenden Sie einen Parser. Nokogiri ist der de-facto-Standard für Ruby und, mit einigen Kenntnissen von CSS oder XPath, können Sie schnell suchen lernen, oder zu ändern, HTML und 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 

Rennen, dass die Ergebnisse in:

<!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> 

Die Tutorials auf der Nokogiri Seite sind Ihr Ausgangspunkt. Stack Overflow ist auch eine gute Ressource, da es viele leicht durchsuchbare Fragen zu allen Aspekten der Verwendung des Edelsteins gibt.

Verwandte Themen