У меня есть такие строки, как
var str = 'One & two & three';
визуализируется в HTML веб-сервером. Мне нужно преобразовать эти строки в
'One & two & three'
В настоящее время это то, что я делаю (с помощью jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
Однако у меня тревожное чувство, что я делаю это неправильно. я пытался
unescape("&")
но это, похоже, не работает, как и decodeURI / decodeURIComponent.
Есть ли другие, более родные и элегантные способы сделать это?
javascript
html
text
decode
Искусство
источник
источник
escape
d или URI , эти функции работать не будут.𝕫
. Это проблема с развивающейся спецификацией; как таковой, вы должны выбрать инструмент, который на самом деле поддерживается, чтобы решить его с помощью.Ответы:
Более современным вариантом для интерпретации HTML (текста и других) из JavaScript является поддержка HTML в
DOMParser
API ( см. Здесь в MDN). ). Это позволяет использовать собственный анализатор HTML браузера для преобразования строки в документ HTML. Он поддерживается в новых версиях всех основных браузеров с конца 2014 года.Если мы просто хотим декодировать некоторый текстовый контент, мы можем поместить его в качестве единственного содержимого в теле документа, проанализировать документ и извлечь его
.body.textContent
.Мы можем видеть в проекте спецификации,
DOMParser
что JavaScript не включен для проанализированного документа, поэтому мы можем выполнить это преобразование текста без проблем с безопасностью.Этот вопрос выходит за рамки этого вопроса, но, пожалуйста , обратите внимание, что если вы берете проанализированные узлы DOM (а не только их текстовое содержимое) и перемещаете их в DOM документа, работающего в режиме реального времени, возможно, что их сценарии будут повторно включены, и может быть проблемы безопасности. Я не исследовал это, поэтому, пожалуйста, будьте осторожны.
источник
Вам нужно декодировать все закодированные сущности HTML или только
&
себя?Если вам нужно только обработать,
&
то вы можете сделать это:Если вам нужно декодировать все сущности HTML, вы можете сделать это без jQuery:
Пожалуйста, обратите внимание на комментарии Марка ниже, которые выделяют дыры в безопасности в более ранней версии этого ответа и рекомендуют использовать,
textarea
а неdiv
смягчать против потенциальных уязвимостей XSS. Эти уязвимости существуют независимо от того, используете ли вы jQuery или простой JavaScript.источник
encoded='<img src="bla" onerror="alert(1)">'
тогда фрагмент выше покажет предупреждение. Это означает, что если ваш закодированный текст поступает от пользователя, его декодирование с помощью этого фрагмента может представлять уязвимость XSS.null
после получения текста установить div , оповещение в img не сработаетalert(1)
все еще работает для меня в Chrome на OS X. Если вы хотите безопасный вариант этого хака, попробуйте использоватьtextarea
.У Матиаса Биненса есть библиотека для этого: https://github.com/mathiasbynens/he
Пример:
Я предпочитаю отдавать предпочтение этому хаку, включая установку HTML-содержимого элемента и последующее чтение его текстового содержимого. Такие подходы могут работать, но они обманчиво опасны и представляют возможности XSS, если они используются для ненадежного пользовательского ввода.
Если вы действительно не можете загрузить библиотеку, вы можете использовать
textarea
хак, описанный в этом ответе, для почти дублированного вопроса, который, в отличие от предложенных различных похожих подходов, не имеет дыр в безопасности, о которых я знаю:Но обратите внимание на проблемы безопасности, затрагивающие сходные подходы к этому, которые я перечислю в связанном ответе! Этот подход является хакерским, и будущие изменения в допустимом содержимом
textarea
(или ошибках в определенных браузерах) могут привести к тому, что код, который полагается на него, однажды вдруг обнаружит дыру в XSS.источник
he
просто великолепна! Большое спасибо за рекомендацию!Это из исходного кода ExtJS.
источник
htmlEnDecode.htmlDecode('€')
должен вернуться'€'
, но вместо этого возвращается'€'
.element.innerText
также делает трюк.источник
Вы можете использовать функцию unescape / escape Lodash https://lodash.com/docs/4.17.5#unescape
ул станет
'fred, barney, & pebbles'
источник
В случае, если вы ищете его, как я - тем временем есть хороший и безопасный метод JQuery.
https://api.jquery.com/jquery.parsehtml/
Вы можете, например, введите это в вашей консоли:
Таким образом, $ .parseHTML (x) возвращает массив, и если в вашем тексте есть разметка HTML, то значение array.length будет больше 1.
источник
x
имеет значение<script>alert('hello');</script>
выше, произойдет сбой. В текущем jQuery он на самом деле не будет пытаться запустить скрипт, но[0]
даст результат,undefined
так что вызовtextContent
завершится неудачно, и ваш скрипт остановится на этом.$('<div />').html(x).text();
выглядит безопаснее - через gist.github.com/jmblog/3222899JQuery будет кодировать и декодировать для вас. Однако вам нужно использовать тег textarea, а не div.
источник
.html()
. Таким образом, даже использованияtextarea
недостаточно для обеспечения безопасности здесь; Я предлагаю не использовать jQuery для этой задачи и писать эквивалентный код с простым API DOM . (Да, это старое поведение jQuery безумно и ужасно.)Сначала создайте
<span id="decodeIt" style="display:none;"></span>
где-нибудь в телеЗатем присвойте строку, которая будет декодирована как innerHTML:
В заключение,
Вот общий код:
источник
stringtodecode
содержит что-то вроде<script>alert(1)</script>
.решение JavaScript, которое ловит общие:
это обратная сторона https://stackoverflow.com/a/4835406/2738039
источник
map[c] || ''
нераспознанные, они не будут отображаться какundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
Для однострочных парней:
источник
Вопрос не определяет происхождение,
x
но имеет смысл защищать, если мы можем, от злонамеренного (или просто неожиданного, из нашего собственного приложения) ввода. Например, предположим,x
имеет значение& <script>alert('hello');</script>
. Безопасный и простой способ справиться с этим в jQuery:Найдено через https://gist.github.com/jmblog/3222899 . Я не вижу много причин, чтобы избегать использования этого решения, поскольку оно, по крайней мере, такое же короткое, если не короче, чем некоторые альтернативы и обеспечивает защиту от XSS.
(Первоначально я разместил это как комментарий, но добавляю его как ответ, поскольку последующий комментарий в той же ветке попросил меня сделать это).
источник
Я попробовал все, чтобы удалить & из массива JSON. Ни один из приведенных выше примеров, но https://stackoverflow.com/users/2030321/chris не дал отличного решения, которое привело меня к решению моей проблемы.
Я не использовал, потому что я не понимал, как вставить его в модальное окно, которое вытягивало данные JSON в массив, но я попробовал это на основе примера, и это сработало:
Мне нравится это, потому что это было просто, и это работает, но не уверен, почему это не широко используется. Искал привет и низ, чтобы найти простое решение. Я продолжаю искать понимание синтаксиса и есть ли риск его использования. Пока не нашли ничего.
источник