Я хочу отобразить текст в HTML с помощью функции javascript. Как я могу избежать html специальных символов в JS? Есть ли API?
Могу ли я избежать html специальных символов в javascript?
Ответ 1
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
Ответ 2
Вы можете использовать функцию jQuery .text()
.
Например:
Из документации jQuery относительно функции .text()
:
Нам нужно знать, что этот метод избегает строки при необходимости, чтобы она корректно отображалась в HTML. Для этого он вызывает метод DOM.createTextNode(), не интерпретирует строку как HTML.
Предыдущие версии документации jQuery сформулированы так (выделено мной):
Нам нужно знать, что этот метод избегает строки при необходимости, чтобы она корректно отображалась в HTML. Для этого он вызывает метод DOM.createTextNode(), который заменяет специальные символы своими эквивалентами сущности HTML (например, & lt; для <).
Ответ 3
function escapeHtml(html){
var text = document.createTextNode(html);
var p = document.createElement('p');
p.appendChild(text);
return p.innerHTML;
}
// Escape while typing & print result
document.querySelector('input').addEventListener('input', e => {
console.clear();
console.log( escapeHtml(e.target.value) );
});
<input style='width:90%; padding:6px;' placeholder='<b>cool</b>'>
Ответ 4
Думаю, я нашел правильный способ сделать это...
// Create a DOM Text node:
var text_node = document.createTextNode(unescaped_text);
// Get the HTML element where you want to insert the text into:
var elem = document.getElementById('msg_span');
// Optional: clear its old contents
//elem.innerHTML = '';
// Append the text node into it:
elem.appendChild(text_node);
Ответ 5
Использование lodash
_.escape('fred, barney, & pebbles');
// => 'fred, barney, & pebbles'
Ответ 6
Это, безусловно, самый быстрый способ, которым я видел это. Кроме того, все это выполняется без добавления, удаления или изменения элементов на странице.
function escapeHTML(unsafeText) {
let div = document.createElement('div');
div.innerText = unsafeText;
return div.innerHTML;
}
Ответ 7
Интересно было найти лучшее решение:
var escapeHTML = function(unsafe) {
return unsafe.replace(/[&<"']/g, function(m) {
switch (m) {
case '&':
return '&';
case '<':
return '<';
case '"':
return '"';
default:
return ''';
}
});
};
Я не анализирую >
, потому что он не нарушает XML/HTML-код в результате.
Вот критерии: http://jsperf.com/regexpairs
Также я создал универсальную функцию escape
: http://jsperf.com/regexpairs2
Ответ 8
Самый краткий и эффективный способ отображения незакодированного текста - использовать свойство textContent
.
Быстрее, чем с помощью innerHTML
. И это без учета возможности избежать накладных расходов.
document.body.textContent = 'a <b> c </b>';
Ответ 9
DOM Elements поддерживает преобразование текста в HTML, присваивая innerText. innerText не является функцией, но назначение ему работает так, как будто текст был экранирован.
document.querySelectorAll('#id')[0].innerText = 'unsafe " String >><>';
Ответ 10
Вы можете кодировать каждый символ в строке:
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
Или просто нацелитесь на главных героев, чтобы беспокоиться (&, inebreaks, <, > , "and '), например:
function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}
test.value=encode('How to encode\nonly html tags &<>\'" nice & fast!');
/*************
* \x26 is &ersand (it has to be first),
* \x0A is newline,
*************/
<textarea id=test rows="9" cols="55">www.WHAK.com</textarea>
Ответ 11
Наткнулся на эту проблему при построении структуры DOM. Этот вопрос помог мне решить его. Я хотел использовать двойной шеврон в качестве разделителя пути, но добавление нового текстового узла напрямую привело к отображению кода экранированного символа, а не самого символа:
var _div = document.createElement('div');
var _separator = document.createTextNode('»');
//_div.appendChild(_separator); /* this resulted in '»' being displayed */
_div.innerHTML = _separator.textContent; /* this was key */
Ответ 12
Попробуйте это, используя библиотеку prototype.js
:
string.escapeHTML();
Ответ 13
Я придумал это решение.
Предположим, что мы хотим добавить некоторый html к элементу с небезопасными данными от пользователя или базы данных.
var unsafe = 'some unsafe data like <script>alert("oops");</script> here';
var html = '';
html += '<div>';
html += '<p>' + unsafe + '</p>';
html += '</div>';
element.html(html);
Это небезопасно для атак XSS. Теперь добавьте это.
$(document.createElement('div')).html(unsafe).text();
Итак, это
var unsafe = 'some unsafe data like <script>alert("oops");</script> here';
var html = '';
html += '<div>';
html += '<p>' + $(document.createElement('div')).html(unsafe).text(); + '</p>';
html += '</div>';
element.html(html);
Мне это намного проще, чем использовать .replace()
, и он удалит!!! все возможные html-теги (надеюсь).
Ответ 14
Я не совсем уверен, что это то, что вы имеете в виду, но вы можете избежать html-символов в строковой переменной следующим образом:
var string = escape("escaped lessthan looks like this <");
который устанавливает строку == в escaped%20lessthan%20looks%20like%20this%20%3C