Wie codiere / decodiere ich HTML-Entitäten in Ruby?


200

Ich versuche , einige HTML - Entitäten, wie entschlüsseln '&amp;lt;'werden '<'.

Ich habe ein altes Juwel ( html_helpers ), aber es scheint zweimal aufgegeben worden zu sein.

Irgendwelche Empfehlungen? Ich werde es in einem Modell verwenden müssen.


6
Gerade gefunden 'htmlentities' ( htmlentities.rubyforge.org )
Kostas

Ich sollte angeben, dass ich das HTML von einer Reihe von verschiedenen Websites bekomme und es als einfachen Text in der Datenbank speichern muss
Kostas

1
Während die meisten Stimmen für die Verwendung von CGI verwendet wurden, tun Sie dies nicht. Das ist so, als würden Sie den gesamten aktiven Support in Anspruch nehmen, um eine einzige Methode zu erhalten. Verwenden Sie stattdessen HTMLEntities, wie in der ausgewählten Antwort angegeben.
Der Blechmann

Antworten:


153

HTMLEntities können es tun:

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"

Zdrasti Ivailo. Vielen Dank für Ihren Kommentar; es mein Problem gelöst über auf Wie kann ich XML Zeichenentitätsverweise in Ruby machen? auch!
Josh Glover

4
Ja, das HTMLEntitiesJuwel befasst sich mit Fällen wie &aring;und &mdash;was CGI.unescapeHTMLnicht.
Thomax

295

Um die Zeichen zu codieren, können Sie Folgendes verwenden CGI.escapeHTML:

string = CGI.escapeHTML('test "escaping" <characters>')

Um sie zu entschlüsseln, gibt es CGI.unescapeHTML:

CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")

Zuvor müssen Sie natürlich die CGI-Bibliothek einbinden:

require 'cgi'

Und wenn Sie sich in Rails befinden, müssen Sie CGI nicht zum Codieren der Zeichenfolge verwenden. Da ist die hMethode.

<%= h 'escaping <html>' %>

9
Ich habe diesen Ansatz zuerst ausprobiert, aber Entitäten wie "& nbsp;" in "". Ich denke, ich sollte angeben, dass ich das HTML von einer Reihe verschiedener Websites bekomme und es als einfachen Text in der Datenbank speichern muss.
Kostas

2
Wenn Sie HTML-Entitäten für die Speicherung als Klartext in einer Datenbank dekodieren, sollten Sie erwarten, dass sich Ihre Datenbank häufig über fehlerhafte Zeichen beschwert. Codierte Entitäten werden codiert, damit sie als einfacher Text übertragen werden können. Durch das Dekodieren können und werden sie höchstwahrscheinlich in Zeichen mit höherem Bit-Satz (AKA-Binär) zurückgesetzt. Fast genauso wahrscheinlich könnten Sie Multibyte-Zeichen erhalten, die eine Datenbank, die einfachen Text erwartet, wirklich irritieren. Sie sollten besser dekodieren, bis sich nichts mehr ändert, dann einmal kodieren, damit alles normalisiert ist, und sie dann speichern.
der Blechmann

1
Ich bin auf viel HTML mit Entitäten gestoßen, die mehrfach codiert wurden, was die Dinge wirklich durcheinander bringt. Schauen Sie sich Luffa an ; Die Scrubber wurden dafür entwickelt, wenn ich mich recht erinnere.
der Blechmann

3
Wir haben unsere Datenbank so eingestellt, dass Unicode gespeichert wird, daher bezweifle ich, dass sie sich überhaupt beschweren wird. Und Luffa ist nicht das, wonach ich suche, ich möchte die HTML-Tags nicht loswerden - an dieser Stelle sowieso nicht.
Kostas

1
Es ist 2015, unescapeHTML lässt noch einige der Entitäten wie A akut
nurettin

47

Ich denke, Nokogiri Juwel ist auch eine gute Wahl. Es ist sehr stabil und hat eine große beitragende Gemeinschaft.

Proben:

a = Nokogiri::HTML.parse "foo&nbsp;b&auml;r"    
a.text 
=> "foo bär"

oder

a = Nokogiri::HTML.parse "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"

3
@theTinMan, ja, ich denke, es hängt von der Nachfrage ab. Wie Sie in den Diskussionen in diesem Thema sehen können, können CGI.escapeHTMLeinige Fälle möglicherweise nicht gelöst werden. Auf der anderen Seite bin ich sicher, dass Sie Nokogirieine gute Wahl sind , wenn Sie umfassende Unterstützung benötigen .
Hoang Le

6
Wenn Sie Nokogiri bereits für eine HTML-Analyse verwenden, ist es nicht zumutbar, ein weiteres Juwel nur für diesen Zweck zu installieren. Zum Beispiel verwende ich Sanitize gem zum Bereinigen von HTML. Es stellt sich heraus, dass dieses Juwel Nokogiri unter der Haube verwendet, und es wäre eine Schande, das nicht zu erleben. Danke @HoangLe für den Tipp!
Tomalla

1
Hinweis: CGI::escapeHTMLEntgeht deutschen Schriftzeichen wie äöüß und vielleicht mehr nicht ... Mit Nokogiri habe ich noch nicht nachgesehen, aber das wäre ein Pluspunkt.
Schönheit

HTMLEntities wäre eine leichte und fähige Wahl. Ich benutze Nokogiri oft und wenn ich es nicht bereits geladen habe, würde ich mich für HTMLEntities entscheiden. CGI ist veraltet.
Der Blechmann

36

Um Zeichen in Rails zu dekodieren, verwenden Sie:

<%= raw '<html>' %>

So,

<%= raw '&lt;br&gt;' %>

würde ausgeben

<br>

5
Dies funktioniert jedoch nur in der Ansicht. Ich brauche etwas, das auch in ActiveRecord funktioniert.
Kostas

3
Gerade im Debugger getestet - raw '& lt br & gt' ==> '& lt br & gt'.
Will Tomlins

13
#rawdekodiert nichts. Es weist die Ansicht an, die Zeichenfolge nicht zu codieren. Dazu wird die Zeichenfolge in a eingeschlossen ActiveSupport::SafeBuffer, für die wiederum ein Flag ( html_safe?) auf true gesetzt ist. Die Ansicht verwendet dieses Flag, um zu bestimmen, dass die Zeichenfolge direkt in den HTML-Code eingefügt werden kann, ohne dass sie maskiert wird. Ich html_safestelle mir das gerne als Hinweis des Programmierers vor, dass die betreffende Zeichenfolge bereits ordnungsgemäß maskiert wurde.
Moxley Stratton

9

Wenn Sie nicht nur zu diesem Zweck (wie HTMLEntities) eine neue Abhängigkeit hinzufügen möchten und diese bereits verwenden Hpricot, kann sie für Sie sowohl entkommen als auch entkommen. Es geht um viel mehr als CGI:

Hpricot.uxs "foo&nbsp;b&auml;r"
=> "foo bär"

5
Hinweis für Leute, die sich das jetzt ansehen - Hpricot wird nicht mehr gewartet.
SamStephens

2
Verwenden Nokogiri , die für XML / HTML - Analyse, statt Hpricot der Defacto - Standard ist.
der Blechmann

0

Sie können htmlasciiEdelstein verwenden:

Htmlascii.convert string

-5
<% str="<h1> Test </h1>" %>

result: &lt; h1 &gt; Test &lt; /h1 &gt;

<%= CGI.unescapeHTML(str).html_safe %>

Ich denke, wenn Sie html_safe zu einem vom Benutzer eingegebenen Text hinzufügen, sagen Sie der Ansicht, dass es sicher ist, wenn es möglich ist, dass es nicht sicher ist. Dies würde Ihre Benutzer gefährden, wenn sie diese Ansicht laden.
user1515295

Ich weiß nicht warum so negativ. Ich habe alle Lösungen in dieser Frage ausprobiert. Nur das funktioniert gut. Über HTML sicher möchte der Benutzer den HTML-Code rendern, dann ist HTML_SAFE korrekt.
Diego Somar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.