Я пишу расширение Chrome , который включает в себя делает много следующей работу: дезинфицирующее строку , которые могут содержать теги HTML, путь преобразования <
, >
и &
в <
, >
и &
, соответственно.
(Другими словами, то же самое, что и PHP htmlspecialchars(str, ENT_NOQUOTES)
- я не думаю, что есть реальная необходимость преобразовывать символы двойных кавычек.)
Это самая быстрая функция, которую я нашел до сих пор:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Но все еще есть большая задержка, когда мне нужно пропустить несколько тысяч струн за один раз.
Кто-нибудь может улучшить это? Это в основном для строк от 10 до 150 символов, если это имеет значение.
(Одна из моих идей заключалась в том, чтобы не беспокоиться о кодировании знака «больше» - будет ли это реальная опасность?)
javascript
html
regex
performance
string
каллум
источник
источник
Ответы:
Вы можете попробовать передать функцию обратного вызова для выполнения замены:
Вот тест производительности: http://jsperf.com/encode-html-entities для сравнения с
replace
повторным вызовом функции и использованием метода DOM, предложенного Дмитрием.Кажется, твой путь быстрее ...
Но зачем тебе это нужно?
источник
>
.if (/[<>&"]/.test(str) { ... }
>
- это специальный символ в HTML, поэтому избегайте его. Просто как тот. :)>
замену, это ускорит процесс .Вот один из способов сделать это:
Вот демо.
источник
Метод Мартейна как функция-прототип:
источник
String
этому, что это должно быть escapeHtml, поскольку это не экранирование для String в целом. ЭтоString.escapeHtml
правильно, ноString.escape
возникает вопрос: «Бежать ради чего?».Еще более быстрое / короткое решение:
Это связано с каким-то странным пережитком JavaScript, в котором элемент Option сохраняет конструктор, который выполняет такого рода экранирование автоматически.
Кредит на https://github.com/jasonmoo/t.js/blob/master/t.js
источник
Исходный код AngularJS также имеет версию внутри angular-sanitize.js .
источник
Самый быстрый способ:
Этот метод примерно в два раза быстрее, чем методы, основанные на замене, см. Http://jsperf.com/htmlencoderegex/35 .
Источник: https://stackoverflow.com/a/17546215/698168
источник
Универсальный сценарий:
http://pastebin.com/JGCVs0Ts
источник
источник
Я не совсем уверен в скорости, но если вы ищете простоты, я бы предложил использовать escape- функцию lodash / подчеркивания .
источник
Метод Мартейн как одной функции с обработкой " знак ( с использованием в JavaScript ):
источник
Добавлю
XMLSerializer
в кучу. Он обеспечивает самый быстрый результат без использования кэширования объектов (ни в сериализаторе, ни в узле Text).Дополнительным бонусом является то, что он поддерживает атрибуты, которые сериализуются иначе, чем текстовые узлы:
Вы можете увидеть, что он фактически заменяет, проверив спецификацию как для текстовых узлов, так и для значений атрибутов . В полной документации больше типов узлов, но концепция та же.
Что касается производительности, то он самый быстрый без кеширования. Когда вы разрешаете кэширование, то вызов
innerHTML
HTMLElement с дочерним узлом Text будет самым быстрым. Regex будет самым медленным (как доказывают другие комментарии). Конечно, XMLSerializer мог бы быть быстрее в других браузерах, но в моем (ограниченном) тестированииinnerHTML
самым быстрым был a .Самая быстрая одиночная строка:
new XMLSerializer().serializeToString(document.createTextNode(text));
Самый быстрый с кешированием:
https://jsperf.com/htmlentityencode/1
источник
Немного поздно к выставке, но что не так с использованием encodeURIComponent () и decodeURIComponent () ?
источник