Как HTML кодировать / экранировать строку? Есть ли встроенный?
у меня есть ненадежная строка, которую я хочу показать как текст на HTML-странице. Мне нужно сбежать от чаров<
' и '&
' как объекты HTML. Чем меньше суеты, тем лучше.
Я использую UTF8 и не нуждаюсь в других сущностях для акцентированных букв.
есть ли встроенная функция в Ruby или Rails, или я должен свернуть свой собственный?
8 ответов:
проверка Рубин CGI класса. Существуют методы кодирования и декодирования HTML, а также URL-адресов.
CGI::escapeHTML('Usage: foo "bar" <baz>') # => "Usage: foo "bar" <baz>"
в Ruby on Rails 3 HTML будет экранирован по умолчанию.
для неэкранированных строк используйте:
<%= raw "<p>hello world!</p>" %>
ERB:: Util.html_escape может использоваться в любом месте. Он доступен без использования
require
в рельсы.
дополнение к ответу Кристофера Брэдфорда, чтобы использовать HTML-экранирование в любом месте, так как большинство людей не используют
CGI
в настоящее время, вы можете также использоватьRack
:require 'rack/utils' Rack::Utils.escape_html('Usage: foo "bar" <baz>')
можно использовать
h()
илиhtml_escape()
, но большинство людей используютh()
по Конвенции.h()
сокращенноhtml_escape()
в рельсы.в вашем контроллере:
@stuff = "<b>Hello World!</b>"
на ваш взгляд:
<%=h @stuff %>
если вы просматриваете источник HTML: вы увидите вывод без фактического выделения данных жирным шрифтом. Т. е. кодируется как
<b>Hello World!</b>
.он будет отображаться как
<b>Hello World!</b>
сравнение различных методов:
> CGI::escapeHTML("quote ' double quotes \"") => "quote ' double quotes "" > Rack::Utils.escape_html("quote ' double quotes \"") => "quote ' double quotes "" > ERB::Util.html_escape("quote ' double quotes \"") => "quote ' double quotes ""
Я написал свой собственный, чтобы быть совместимым с Rails ActiveMailer escaping:
def escape_html(str) CGI.escapeHTML(str).gsub("'", "'") end
h()
также полезно для экранирования кавычек.например, у меня есть представление, которое генерирует ссылку с помощью текстового поля
result[r].thtitle
. Текст может содержать одинарные кавычки. Если бы я не сбежалresult[r].thtitle
в методе подтверждения Javascript сломается:<%= 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 %> <a href="#" onclick="if (confirm('docs: add column &apos;dummy&apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="<= Remove">docs: add column 'dummy'</a>
Примечание:
:html
объявление заголовка волшебным образом ускользает по рельсам.