Я написал крошечную маленькую функцию, которая делает это. Это только экранирование "
, &
, <
и >
(но обычно это все, что вам нужно в любом случае). Это немного более элегантно, чем ранее предложенные решения в том, что он использует только one .replace()
, чтобы сделать все преобразования. ( РЕДАКТИРОВАТЬ 2: Снижение сложности кода, что делает функцию еще меньше и удобнее, если вам интересно узнать об исходном коде, см. Конец этого ответа.)
function escapeHtml(text) {
'use strict';
return text.replace(/[\"&<>]/g, function (a) {
return { '"': '"', '&': '&', '<': '<', '>': '>' }[a];
});
}
Это обычный Javascript, jQuery не используется.
Бегство /
и '
тоже
Редактировать в ответ на комментарий mklement .
Вышеуказанная функция может быть легко расширена для включения любого символа. Чтобы указать больше символов для экранирования, просто вставьте их как в класс символов в регулярном выражении (т. Е. Внутри /[...]/g
), так и в виде записи в объекте chr
. ( РЕДАКТ. 2: Аналогичным образом сократили и эту функцию.)
function escapeHtml(text) {
'use strict';
return text.replace(/[\"&'\/<>]/g, function (a) {
return {
'"': '"', '&': '&', "'": ''',
'/': '/', '<': '<', '>': '>'
}[a];
});
}
Обратите внимание на вышеприведенное использование '
для апострофа (вместо этого можно было использовать символическую сущность '
- она определена в XML, но изначально не была включена в спецификацию HTML и поэтому могла поддерживаться не всеми браузерами См .: Статья в Википедии о кодировке символов HTML ). Я также вспоминаю, что где-то читал, что использование десятичных сущностей более широко поддерживается, чем использование шестнадцатеричных, но сейчас я не могу найти источник для этого. (И не может быть много браузеров, которые не поддерживают шестнадцатеричные сущности.)
Примечание: Добавление /
и '
в список экранированных символов не так уж и полезно, так как они не имеют никакого особого значения в HTML и не нужны чтобы сбежать.
Оригинал escapeHtml
Функция
EDIT 2: Исходная функция использовала переменную (chr
) для хранения объекта, необходимого для обратного вызова .replace()
. Эта переменная также нуждалась в дополнительной анонимной функции для ее расширения, что делало функцию (без необходимости) немного больше и сложнее.
var escapeHtml = (function () {
'use strict';
var chr = { '"': '"', '&': '&', '<': '<', '>': '>' };
return function (text) {
return text.replace(/[\"&<>]/g, function (a) { return chr[a]; });
};
}());
Я не проверял, какая из двух версий быстрее. Если у вас есть, не стесняйтесь добавлять информацию и ссылки о ней здесь.