Я написал крошечную функцию, которая делает это. Он только убегает "
, &
, <
и >
(но , как правило, это все , что вам нужно в любом случае). Это немного более элегантно, чем ранее предложенные решения в том, что он использует только одно, .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
функция
РЕДАКТИРОВАНИЕ 2: Исходная функция использовала переменную ( chr
) для хранения объекта, необходимого для .replace()
обратного вызова. Эта переменная также нуждалась в дополнительной анонимной функции для ее расширения, что делало функцию (без необходимости) немного больше и сложнее.
var escapeHtml = (function () {
'use strict';
var chr = { '"': '"', '&': '&', '<': '<', '>': '>' };
return function (text) {
return text.replace(/[\"&<>]/g, function (a) { return chr[a]; });
};
}());
Я не проверял, какая из двух версий быстрее. Если вы это сделаете, не стесняйтесь добавлять информацию и ссылки об этом здесь.