Самый быстрый способ избежать HTML-тегов в качестве объектов HTML?
Я пишу расширение Chrome, которое включает в себя выполнение лота следующего задания: дезинфекция строк, которые могут содержать теги HTML, путем преобразования <
, >
и &
в <
, >
и &
соответственно.
(Другими словами, так же, как PHP htmlspecialchars(str, ENT_NOQUOTES)
- я не думаю, что есть настоящая необходимость конвертировать символы двойной кавычки.)
Это самая быстрая функция, которую я нашел до сих пор:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Но до сих пор существует большая отсталость, когда мне нужно пробежать несколько тысяч строк за один раз.
Может ли кто-нибудь улучшить это? Это в основном для строк от 10 до 150 символов, если это имеет значение.
(Одна из моих идей заключалась в том, чтобы не беспокоиться о кодировании знака больше, чем знака - была ли какая-то реальная опасность?)
Ответы
Ответ 1
Вы можете попробовать передать функцию обратного вызова для выполнения замены:
var tagsToReplace = {
'&': '&',
'<': '<',
'>': '>'
};
function replaceTag(tag) {
return tagsToReplace[tag] || tag;
}
function safe_tags_replace(str) {
return str.replace(/[&<>]/g, replaceTag);
}
Вот тест производительности: http://jsperf.com/encode-html-entities для сравнения с вызовом функции replace
повторно и с использованием метода DOM, предложенного Дмитрием.
Ваш путь, кажется, быстрее...
Зачем вам это нужно?
Ответ 2
Здесь вы можете сделать это так:
var escape = document.createElement('textarea');
function escapeHTML(html) {
escape.textContent = html;
return escape.innerHTML;
}
function unescapeHTML(html) {
escape.innerHTML = html;
return escape.textContent;
}
Вот демо.
Ответ 3
Метод Martijn как функция прототипа:
String.prototype.escape = function() {
var tagsToReplace = {
'&': '&',
'<': '<',
'>': '>'
};
return this.replace(/[&<>]/g, function(tag) {
return tagsToReplace[tag] || tag;
});
};
var a = "<abc>";
var b = a.escape(); // "<abc>"
Ответ 4
Самый быстрый способ:
function escapeHTML(html) {
return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}
Этот метод примерно в два раза быстрее, чем методы, основанные на "замене", см. http://jsperf.com/htmlencoderegex/35.
Источник: fooobar.com/questions/14077/...
Ответ 5
Все-в-одном script:
// HTML entities Encode/Decode
function htmlspecialchars(str) {
var map = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'" // ' -> ' for XML only
};
return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}
function htmlspecialchars_decode(str) {
var map = {
"&": "&",
"<": "<",
">": ">",
""": "\"",
"'": "'"
};
return str.replace(/(&|<|>|"|')/g, function(m) { return map[m]; });
}
function htmlentities(str) {
var textarea = document.createElement("textarea");
textarea.innerHTML = str;
return textarea.innerHTML;
}
function htmlentities_decode(str) {
var textarea = document.createElement("textarea");
textarea.innerHTML = str;
return textarea.value;
}
http://pastebin.com/JGCVs0Ts
Ответ 6
Исходный код AngularJS также имеет версию angular -sanitize.js.
var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
// Match everything outside of normal chars and " (quote character)
NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
/**
* Escapes all potentially dangerous characters, so that the
* resulting string can be safely inserted into attribute or
* element text.
* @param value
* @returns {string} escaped text
*/
function encodeEntities(value) {
return value.
replace(/&/g, '&').
replace(SURROGATE_PAIR_REGEXP, function(value) {
var hi = value.charCodeAt(0);
var low = value.charCodeAt(1);
return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
}).
replace(NON_ALPHANUMERIC_REGEXP, function(value) {
return '&#' + value.charCodeAt(0) + ';';
}).
replace(/</g, '<').
replace(/>/g, '>');
}
Ответ 7
Еще более быстрое/короткое решение:
escaped = new Option(html).innerHTML
Это связано с каким-то странным пережитком JavaScript, когда элемент Option сохраняет конструктор, который автоматически выполняет этот вид экранирования.
Кредит для https://github.com/jasonmoo/t.js/blob/master/t.js
Ответ 8
function encode(r) {
return r.replace(/[\x26\x0A\x3c\x3e\x22\x27]/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,
\x22 is ",
\x27 is ',
\x3c is <,
\x3e is >
*/
<textarea id=test rows=11 cols=55>www.WHAK.com</textarea>
Ответ 9
Метод Martijn как единая функция с обработкой метки " (используя в javascript):
function escapeHTML(html) {
var fn=function(tag) {
var charsToReplace = {
'&': '&',
'<': '<',
'>': '>',
'"': '"'
};
return charsToReplace[tag] || tag;
}
return html.replace(/[&<>"]/g, fn);
}
Ответ 10
Я не совсем уверен в скорости, но если вы ищете простоту, я бы предложил использовать функцию escape lodash/underscore.
Ответ 11
Немного опоздал на шоу, но что не так с использованием encodeURIComponent() и decodeURIComponent()?