Видимо, найти это сложнее, чем я думал. И это даже так просто ...
Есть ли функция, эквивалентная PHP htmlspecialchars, встроенная в Javascript? Я знаю, что это довольно легко реализовать самостоятельно, но использование встроенной функции, если она доступна, просто приятнее.
Для тех, кто не знаком с PHP, htmlspecialchars переводит такие вещи, как <htmltag/>
в<htmltag/>
Я знаю это escape()
и encodeURI()
не работаю таким образом.
javascript
html
escaping
html-encode
Барт ван Хейкелом
источник
источник
Ответы:
Существует проблема с вашим кодом решения - он будет избегать только первое вхождение каждого специального символа. Например:
Вот код, который работает правильно:
Обновить
Следующий код даст результаты, идентичные приведенным выше, но он работает лучше, особенно на больших блоках текста (спасибо jbo5112 ).
источник
Это кодировка HTML. Для этого нет встроенной функции javascript, но вы можете подключиться к Google и получить некоторые из них.
Например, http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
РЕДАКТИРОВАТЬ:
Это то, что я проверял:
Вывод:
<htmltag/>
источник
encodeURIComponent
делает, а вовсе не то, что попросил ОП. Так что вы можете отредактировать, пожалуйста? Я не могу отменить мой -1.div
элемент и текстовый узел. Создание текстового узла с текстом `<img src = bogus onerror = alert (1337)>` просто создаст текстовый узел, а неimg
элемент.Стоит прочитать: http://bigdingus.com/2007/12/29/html-escaping-in-javascript/
Примечание : запускайте только один раз. И не запускайте его на уже закодированных строках, например,
&
становится&amp;
источник
С jQuery это может быть так:
Из смежного вопроса Экранирование строк HTML с помощью jQuery
Как упомянуто в комментарии, двойные кавычки и одинарные кавычки остаются для этой реализации как есть. Это означает, что это решение не следует использовать, если вам нужно сделать атрибут элемента в виде необработанной HTML-строки.
источник
<!-- Caps rage begin -->
Этот ответ должен иметь ОТРИЦАТЕЛЬНУЮ оценку, так как ДАЖЕ НЕ ЗАКРЫВАЕТСЯ, ЧТОБЫ ОТВЕТИТЬ НА ВОПРОС «HtmlSpecialChars эквивалент».<!-- Caps rage end -->
он-делает-не-спусковое кавычки-господи-Christ-и-другие божествам. OMG вы JQuery люди.Вот функция для выхода из HTML:
И расшифровать:
источник
Underscore.js предоставляет функцию для этого:
http://underscorejs.org/#escape
Это не встроенная функция Javascript, но если вы уже используете Underscore, это лучшая альтернатива, чем написание собственной функции, если строки для преобразования не слишком велики.
источник
Еще один способ сделать это состоит в том, чтобы полностью отказаться от отображения всех символов и вместо этого преобразовать все нежелательные символы в их соответствующие числовые ссылки на символы, например:
Обратите внимание, что указанный RegEx обрабатывает только определенные символы, которые OP хотел экранировать, но, в зависимости от контекста, в котором будет использоваться экранированный HTML, этих символов может быть недостаточно. Статья Райана Гроува. В HTML есть нечто большее, чем &, <,>, и « является хорошим чтением по этой теме. И в зависимости от вашего контекста может потребоваться следующий RegEx, чтобы избежать внедрения XSS:
источник
образец :
источник
Скорее всего, вам не нужна такая функция. Поскольку ваш код уже находится в браузере *, вы можете напрямую обращаться к DOM, а не генерировать и кодировать HTML-код, который должен быть декодирован в обратном направлении браузером для фактического использования.
Используйте
innerText
свойство для вставки простого текста в DOM безопасно и намного быстрее, чем с помощью любой из представленных escape-функций. Даже быстрее, чем присвоение статической предварительно кодированной строкиinnerHTML
.Используйте
classList
для редактирования классов,dataset
для установкиdata-
атрибутов иsetAttribute
для других.Все это поможет вам убежать. Точнее, экранирование не требуется, и кодирование не будет выполняться под **, поскольку вы работаете с HTML, текстовым представлением DOM.
* Этот ответ не предназначен для пользователей JavaScript на стороне сервера (Node.js и т. Д. )
** Если вы не конвертируете его в фактический HTML впоследствии. Например, доступ
innerHTML
- это то, что происходит, когда вы запускаете$('<div/>').text(value).html();
предложенный в других ответах. Поэтому, если ваша конечная цель - вставить некоторые данные в документ, сделав это таким образом, вы сделаете эту работу дважды. Также вы можете видеть, что в полученном HTML не все закодировано, только тот минимум, который необходим для его правильности. Это делается в зависимости от контекста, поэтому этот метод jQuery не кодирует кавычки и, следовательно, не должен использоваться в качестве escape-кода общего назначения. Экранирование кавычек необходимо, когда вы создаете HTML как строку с ненадежными или содержащими цитаты данными вместо значения атрибута. Если вы используете DOM API, вам вовсе не нужно заботиться о том, чтобы избежать этого.источник
el.textContent = str; el.innerHTML = el.innerHTML.replace(/\n/g, '<br>')
), либо установить дляwhite-space
свойства CSS значениеpre
orpre-wrap
innerText
вместоtextContent
. Хотя он немного медленнее и имеет некоторые другие различия при чтении свойства, он более интуитивен в том смысле, что он выполняет<br>
замену автоматически при назначении ему свойства .Для пользователей Node.JS (или пользователей, использующих Jade Runtime в браузере), вы можете использовать функцию escape Jade.
Нет смысла писать это самостоятельно, если кто-то другой поддерживает это. :)
источник
Я немного уточняю ответ ОК.
Вы можете использовать функции DOM браузера для этого.
Это возвращает
<escapeThis>&
Он использует стандартную функцию
createElement
для создания невидимого элемента, затем использует функцию,textContent
чтобы установить любую строку в качестве ее содержимого, а затемinnerHTML
получить содержимое в своем представлении HTML.источник
источник
Надеюсь, что это выиграет гонку из-за ее производительности и, что важнее всего, не цепочки логики с использованием .replace ('&', '&'). Replace ('<', '<') ...
источник
Перевернутый один:
источник
<
и&gr;
в строке.To write a greater than sign in HTML type &gt;
он будет отображаться некорректно>
вместо>
OWASP рекомендует, чтобы «[e] xcept для буквенно-цифровых символов, [вы должны] экранировать все символы со значениями ASCII меньше 256 с
&#xHH;
форматом (или именованным объектом, если он доступен), чтобы предотвратить переключение из атрибута [an]».Итак, вот функция, которая делает это, с примером использования:
источник
Это решение использует числовой код символов, например
<
, заменяется на<
.Хотя его производительность немного хуже, чем у решения с использованием карты , у него есть свои преимущества:
источник