Как HTML-кодировать/экранировать строку?Есть встроенный?
-
22-08-2019 - |
Вопрос
У меня есть ненадежная строка, которую я хочу отобразить в виде текста на странице HTML.Мне нужно избежать символов '<
' и '&
' как объекты HTML.Чем меньше суеты, тем лучше.
Я использую UTF8, и мне не нужны другие объекты для букв с диакритическими знаками.
Есть ли встроенная функция в Ruby или Rails или мне следует создать свою собственную?
Решение
А h
вспомогательный метод:
<%=h "<p> will be preserved" %>
Другие советы
Оформить заказ на Рубин компьютерная графика сорт.Существуют методы кодирования и декодирования 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:
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
Объявление заголовка волшебным образом экранируется Rails.