RubyでHTMLエンティティをエンコード/デコードするにはどうすればよいですか?


200

'&amp;lt;'なるなど、一部のHTMLエンティティをデコードしようとしています'<'

私は古い宝石(html_helpers)を持っていますが、2回放棄されたようです。

何かお勧めですか?モデルで使用する必要があります。


6
「htmlentities」(htmlentities.rubyforge.org)が見つかりました
Kostas

さまざまなサイトからHTMLを取得し、それをデータベースにプレーンテキストとして保存する必要があることを指定する必要があります
Kostas

1
ほとんどの投票はCGIを使用して行われましたが、そうではありません。これは、単一のメソッドを取得するためにすべてのアクティブサポートを取得するようなものです。代わりに、選択した回答に記載されているように、HTMLEntitiesを使用してください。
Tin Man

回答:


153

HTMLEntitiesはそれを行うことができます:

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

ズドラスティ・イヴァイロ。コメントありがとうございます; RubyでXML文字エンティティ参照をレンダリングするにはどうすればよいですか?同じように!
Josh Glover

4
うん、HTMLEntities宝石のようなケースを扱う&aring;&mdash;されCGI.unescapeHTMLていません。
thomax、2014

295

文字をエンコードするには、以下を使用できますCGI.escapeHTML

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

それらをデコードするためにありますCGI.unescapeHTML

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

もちろん、その前にCGIライブラリーを組み込む必要があります。

require 'cgi'

また、Railsを使用している場合は、CGIを使用して文字列をエンコードする必要はありません。h方法があります。

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

9
私は最初にこのアプローチを試しましたが、「&nbsp;」のようなエンティティにはなりません。「」に。さまざまなサイトからHTMLを取得し、プレーンテキストとしてデータベースに保存する必要があることを指定する必要があると思います。
Kostas、

2
HTMLエンティティをプレーンテキストとしてデータベースに保存するためにデコードする場合、データベースが不正な文字について多くの不満を抱くと予想されます。エンコードされたエンティティは、プレーンテキストとして転送できるようにエンコードされます。それらをデコードすると、それらを上位ビットセット文字、別名バイナリに戻すことができます。ほとんどの場合、プレーンテキストを期待しているDBを本当に苛立たせるマルチバイト文字になる可能性があります。何も変わらないまでデコードし、一度エンコードしてすべてが正規化されてから保存するほうがよいでしょう。
Tin Man

1
複数回エンコードされたエンティティを含むHTMLに多く遭遇し、実際に混乱を引き起こしています。ヘチマをチェックしてください。私の記憶が正しければ、そのスクラバーはこのために設計されました。
Tin Man、

3
Unicodeを保存するようにデータベースを設定しているため、文句を言うことはありません。そして、ヘチマは私が探しているものではありません、私はhtmlタグを取り除きたくありません-とにかく現時点ではありません。
Kostas、2011年

1
それは2015年ですが、unescapeHTMLはA急性などの一部のエンティティをまだ省略しています
ヌレティン

47

のこぎりも良い選択だと思います。それは非常に安定しており、巨大な貢献コミュニティがあります。

サンプル:

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

または

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、そうだね、それは需要次第だと思う。このトピックの説明からわかるように、CGI.escapeHTML場合によっては解決できない可能性があります。一方、完全なサポートが必要な場合は、私がNokogiri選択するのは確かです。
Hoang Le

6
さらに、HTML解析にすでにNokogiriを使用している場合、その目的のためだけにさらに別のGemをインストールするのは不合理です。たとえば、HTMLのクリーンアップにSanitize gemを使用しています。この宝石はフードの下でノコギリを使用していることが判明しているため、それを取り入れないのは残念です。ヒントをありがとう@HoangLe!
Tomalla 2016

1
注:CGI::escapeHTMLäöüßのようなドイツ語の文字をエスケープしません。おそらくそれ以上です...
ビューティー

HTMLEntitiesは軽量で有能な選択肢です。私はNokogiriをたくさん使用しており、既にロードしていない限り、HTMLEntitiesを使用します。CGIは最新ではありません。
ブリキの男

36

Railsで文字をデコードするには、以下を使用します。

<%= raw '<html>' %>

そう、

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

出力します

<br>

5
ただし、これはビューでのみ機能します。ActiveRecordでも機能するものが必要です。
Kostas、2011年

3
デバッガでテストされました-raw '&lt br&gt' ==> '&lt br&gt'。
トムリンズ、

13
#raw何もデコードしません。文字列をエンコードしないようにビューに指示します。これは、文字列をでラップすることActiveSupport::SafeBufferで行われ、フラグ(html_safe?)がtrueに設定されます。ビューはこのフラグを使用して、文字列をエスケープせずに直接HTMLに挿入できることを決定します。html_safe問題の文字列がすでに適切にエスケープされていることをプログラマーが示すものと考えたいです。
Moxley Stratton

9

これを行うためだけに新しい依存関係を追加したくない場合(などHTMLEntities)、既にを使用Hpricotしている場合は、エスケープとエスケープ解除の両方を行うことができます。それはより多くを処理しますCGI

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

5
これを今見ている人への注意-Hpricotはもはやメンテナンスされていません。
SamStephens 2013年

2
使用鋸山代わりHpricotのXML / HTML構文解析のためのデファクトスタンダードです、、。
ティンマン


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

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

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

ユーザーが入力したテキストにhtml_safeを追加することで、安全ではない可能性があるときに安全であるとビューに伝えていると思います。これは、ユーザーがそのビューをロードするときに、ユーザーを危険にさらすことになります。
user1515295

なぜそんなにネガティブなのか分かりません。この質問のすべての解決策を試しました。これだけがうまくいきます。HTMLセーフについては、ユーザーはHTMLのレンダリングを望んでおり、HTML_SAFEが正しいです。
ディエゴソマール2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.