web-dev-qa-db-ja.com

文字列をHTMLエンコード/エスケープする方法は?ビルトインはありますか?

HTMLページのテキストとして表示したい信頼できない文字列があります。文字 '<'および '&'をHTMLエンティティとしてエスケープする必要があります。大騒ぎが少ないほど良い。

私はUTF8を使用していますが、アクセント付き文字に他のエンティティは必要ありません。

RubyまたはRailsに組み込み関数がありますか、それとも独自の関数をロールバックする必要がありますか?

92
kch

hヘルパーメソッド:

<%=h "<p> will be preserved" %>
88
Trevor Bramble

Ruby CGI クラスをチェックアウトします。 HTMLおよびURLをエンコードおよびデコードする方法があります。

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
136

Ruby on Rails 3 HTMLはデフォルトでエスケープされます。

エスケープされていない文字列の場合:

<%= raw "<p>hello world!</p>" %>
75
RSK

ERB :: Util.html_escape はどこでも使用できます。 Railsでrequireを使用せずに使用できます。

25
Viktor Trón

ほとんどの人はCGIを使用していないため、HTMLエスケープをどこでも使用するというChristopher Bradfordの回答に加えて、Rackも使用できます。

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
15
J-_-L

h()またはhtml_escape()のいずれかを使用できますが、ほとんどの人は慣例によりh()を使用します。 h()はRailsのhtml_escape()の略です。

コントローラーで:

@stuff = "<b>Hello World!</b>"

あなたの見解では:

<%=h @stuff %>

HTMLソースを表示すると、実際にデータを太字にせずに出力が表示されます。つまり&lt;b&gt;Hello World!&lt;/b&gt;としてエンコードされます。

<b>Hello World!</b>として表示されます

13
Brian R. Bondy

さまざまな方法の比較:

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

Rails ActiveMailerエスケープと互換性があるように自分で書きました:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end
9
Dorian

h()は、引用符のエスケープにも役立ちます。

たとえば、テキストフィールドresult[r].thtitleを使用してリンクを生成するビューがあります。テキストには一重引用符を含めることができます。 confirmメソッドでresult[r].thtitleをエスケープしなかった場合、Javascriptは壊れます。

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action         =>:delete_resourced,
:id     => result[r].id,
:th     => thread,                                                                                                      
:html       =>{:title=> "<= Remove"},                                                       
:confirm    => h("#{result[r].thtitle} will be removed"),                                                   
:method     => :delete %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

注::htmlタイトル宣言はRailsによって魔法のようにエスケープされます。

0
Noddinoff