Как HTML кодировать / экранировать строку? Есть ли встроенный? - PullRequest
88 голосов
/ 28 марта 2009

У меня есть недоверенная строка, которую я хочу показать в виде текста на странице HTML. Мне нужно экранировать символы '<' и '&' как объекты HTML. Чем меньше суеты, тем лучше.

Я использую UTF8 и мне не нужны другие объекты для акцентированных букв.

Есть ли встроенная функция в Ruby или Rails, или я должен свернуть свою собственную?

Ответы [ 8 ]

133 голосов
/ 30 сентября 2010

Оформить заказ Руби CGI класс. Существуют методы для кодирования и декодирования HTML, а также URL-адресов.

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
85 голосов
/ 28 марта 2009

Вспомогательный метод h:

<%=h "<p> will be preserved" %>
73 голосов
/ 08 июня 2011

В Ruby on Rails 3 HTML будет экранирован по умолчанию.

Для неэкранированных строк используйте:

<%= raw "<p>hello world!</p>" %>
25 голосов
/ 09 февраля 2013

ERB :: Util.html_escape может использоваться где угодно. Он доступен без использования require в Rails.

15 голосов
/ 29 января 2013

Дополнение к ответу Кристофера Брэдфорда об использовании экранирования HTML где угодно, так как большинство людей не используют CGI в настоящее время, вы также можете использовать Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
13 голосов
/ 29 марта 2009

Вы можете использовать h() или html_escape(), но большинство людей используют h() по соглашению. h() это сокращение от html_escape() в рельсах.

В вашем контроллере:

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

На ваш взгляд:

<%=h @stuff %>

Если вы просматриваете исходный код HTML: вы увидите вывод, фактически не выделив данные. То есть кодируется как &lt;b&gt;Hello World!&lt;/b&gt;.

Будет отображаться как <b>Hello World!</b>

8 голосов
/ 24 февраля 2017

Сравнение различных методов:

> 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
0 голосов
/ 07 ноября 2011

h() также полезно для экранирования кавычек.

Например, у меня есть представление, которое генерирует ссылку, используя текстовое поле result[r].thtitle. Текст может содержать одинарные кавычки. Если я не уйду 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.

...