Как использовать jQuery для декодирования HTML-объектов в строке?
Как декодировать объекты HTML с помощью jQuery?
Ответ 1
Примечание по безопасности:, используя этот ответ (сохраненный в его первоначальной форме ниже), может ввести lucascaro answer для объяснения уязвимостей в этом ответе и используйте подход либо из этого ответа, либо из Отметьте ответ Amery.
Собственно, попробуйте
var decoded = $("<div/>").html(encodedStr).text();
Ответ 2
Без jQuery:
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
console.log(decodeEntities('1 & 2')); // '1 & 2'
Это работает аналогично принятому ответу, но безопасно использовать с ненадежным вводом пользователя.
Проблемы безопасности при сходных подходах
Как отмеченный Майком Самуэлем, выполнение этого с <div>
вместо <textarea>
с ненадежным пользовательским вводом является уязвимостью XSS, даже если <div>
никогда не добавляется в DOM:
function decodeEntities(encodedString) {
var div = document.createElement('div');
div.innerHTML = encodedString;
return div.textContent;
}
// Shows an alert
decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">')
Однако эта атака невозможна против <textarea>
, потому что нет элементов HTML, которые разрешены для содержимого <textarea>
. Следовательно, любые HTML-теги, все еще присутствующие в "закодированной" строке, будут автоматически закодированы сущностью в браузере.
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
// Safe, and returns the correct answer
console.log(decodeEntities('<img src="nonexistent_image" onerror="alert(1337)">'))
Выполнение этого с помощью jQuery .html()
и .val()
вместо использования .innerHTML
и .value
также небезопасен * для некоторых версий jQuery, даже при использовании textarea
. Это связано с тем, что более старые версии jQuery преднамеренно и явно оценивают сценарии, содержащиеся в строке, переданной в .html()
. Следовательно, такой код показывает предупреждение в jQuery 1.8:
// Shows alert
$('<textarea>').html('<script>alert(1337)</script>').text()
* Благодаря Эру Пенкман за эту уязвимость.
Ответ 3
Как сказал Майк Самуэль, не используйте jQuery.html(). text() для декодирования html-объектов, поскольку это небезопасно.
Вместо этого используйте средство визуализации шаблонов, например Mustache.js или decodeEntities от Комментарий @VyvIT.
Underscore.js библиотека утилитных лент поставляется с методами escape
и unescape
, но они небезопасны для ввода пользователем:
Ответ 4
Я думаю, вы смешиваете текст и методы HTML. Посмотрите на этот пример, если вы используете внутренний HTML-код элемента как текст, вы получите декодированные HTML-теги (вторая кнопка). Но если вы используете их как HTML, вы получите представление в формате HTML (первая кнопка).
<div id="myDiv">
here is a <b>HTML</b> content.
</div>
<br />
<input value="Write as HTML" type="button" onclick="javascript:$('#resultDiv').html($('#myDiv').html());" />
<input value="Write as Text" type="button" onclick="javascript:$('#resultDiv').text($('#myDiv').html());" />
<br /><br />
<div id="resultDiv">
Results here !
</div>
Первая кнопка пишет: здесь HTML.
Вторая кнопка пишет: - это контент <B> HTML </B> .
Кстати, вы можете увидеть плагин, который я нашел в плагин jQuery - HTML-декодирование и кодирование, который кодирует и декодирует строки HTML.
Ответ 5
Вопрос ограничивается "с помощью jQuery", но может помочь некоторым узнать, что код jQuery, приведенный в лучшем ответе, здесь ниже: это работает с jQuery или без него:
function decodeEntities(input) {
var y = document.createElement('textarea');
y.innerHTML = input;
return y.value;
}
Ответ 6
Вы можете использовать библиотеку he, доступную из https://github.com/mathiasbynens/he
Пример:
console.log(he.decode("Jörg & Jürgen rocked to & fro "));
// Logs "Jörg & Jürgen rocked to & fro"
I бросил вызов автору библиотеки по вопросу о том, есть ли какая-либо причина использовать эту библиотеку в клиентском коде в пользу <textarea>
хак, предоставленный в других ответах здесь и в другом месте. Он дал несколько возможных оправданий:
-
Если вы используете node.js serverside, использование библиотеки для кодирования/декодирования HTML дает вам единственное решение, которое работает как на стороне клиента, так и на серверах.
-
В некоторых алгоритмах декодирования сущностей браузеров есть ошибки или отсутствует поддержка некоторых названных ссылок на символы. Например, Internet Explorer будет как декодировать, так и рендерить неразрывные пробелы (
) правильно, но сообщать о них как обычные пробелы вместо неразрывных через свойство DOM elementinnerText
, нарушая<textarea>
hack (хотя и только второстепенным образом). Кроме того, IE 8 и 9 просто не поддерживают любую новую ссылку на именованные символы, добавленную в HTML 5. Автор он также проводит тестирование поддержки ссылок на именованные символы на http://mathias.html5.org/tests/html/named-character-references/. В IE 8 он сообщает более тысячи ошибок.Если вы хотите изолировать от ошибок браузера, связанных с расшифровкой сущностей и/или иметь возможность обрабатывать полный диапазон имен символов, вы не можете уйти с помощью
<textarea>
hack; вам понадобится библиотека, подобная ему. -
Он просто чертовски хорошо чувствует, что делает вещи таким образом, менее хаки.
Ответ 7
закодировать:
$("<textarea/>").html('<a>').html(); // return '<a>'
расшифровывает:
$("<textarea/>").html('<a>').val() // return '<a>'
Ответ 8
Использование
myString = myString.replace( /\&/g, '&' );
Это проще всего сделать на стороне сервера, потому что, по-видимому, у JavaScript нет встроенной библиотеки для обработки сущностей, и я не нашел ничего в верхней части результатов поиска для различных фреймворков, расширяющих JavaScript.
Найдите "JavaScript-объекты HTML", и вы можете найти несколько библиотек для этой цели, но они, вероятно, будут построены вокруг вышеуказанной логики - замените сущность на сущность.
Ответ 9
Вы должны создать пользовательскую функцию для html-объектов:
function htmlEntities(str) {
return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g,'>').replace(/"/g, '"');
}
Ответ 10
Мне просто нужно было иметь HTML-объект charater (& dArr;) в качестве значения для кнопки HTML. Код HTML хорошо выглядит с самого начала в браузере:
<input type="button" value="Embed & Share ⇓" id="share_button" />
Теперь я добавляю переключатель, который также должен отображать charater. Это мое решение
$("#share_button").toggle(
function(){
$("#share").slideDown();
$(this).attr("value", "Embed & Share " + $("<div>").html("⇑").text());
}
Отображается & dArr; снова в кнопке. Надеюсь, это может помочь кому-то.
Ответ 11
Предположим, что у вас есть строка ниже.
Наши каюты Deluxe - теплые, уютные и удобный
var str = $("p").text(); // get the text from <p> tag
$('p').html(str).text(); // Now,decode html entities in your variable i.e
str и назначьте тег
.
что он.
Ответ 12
Для пользователей ExtJS, если у вас уже есть закодированная строка, например, когда возвращаемое значение библиотечной функции является содержимым innerHTML, рассмотрите эту функцию ExtJS:
Ext.util.Format.htmlDecode(innerHtmlContent)
Ответ 13
Расширить класс String:
String::decode = ->
$('<textarea />').html(this).text()
и использовать как метод:
"<img src='myimage.jpg'>".decode()
Ответ 14
Вот еще одна проблема: Исключенная строка не выглядит читаемой при назначении входного значения
var string = _.escape("<img src=fake onerror=alert('boo!')>");
$('input').val(string);
Exapmle: https://jsfiddle.net/kjpdwmqa/3/
Ответ 15
Самый простой способ - установить селектор классов для своих элементов, а затем использовать следующий код:
$(function(){
$('.classSelector').each(function(a, b){
$(b).html($(b).text());
});
});
Больше не нужно!
У меня была эта проблема, и я нашел это ясное решение, и он отлично работает.
Ответ 16
Чтобы декодировать HTML-объекты с помощью jQuery, просто используйте эту функцию:
function html_entity_decode(txt){
var randomID = Math.floor((Math.random()*100000)+1);
$('body').append('<div id="random'+randomID+'"></div>');
$('#random'+randomID).html(txt);
var entity_decoded = $('#random'+randomID).html();
$('#random'+randomID).remove();
return entity_decoded;
}
Как использовать:
JavaScript:
var txtEncoded = "á é í ó ú";
$('#some-id').val(html_entity_decode(txtEncoded));
HTML:
<input id="some-id" type="text" />
Ответ 17
Я думаю, что это полная противоположность выбранному решению.
var decoded = $("<div/>").text(encodedStr).html();