Преобразование объектов HTML-символов в обычный текст с помощью javascript
все вопросы говорят все:)
например. мы имеем >
, нам нужно >
, используя только javascript
Обновить. Кажется, что jquery - простой выход. Но было бы неплохо иметь легкое решение. Скорее, как функция, способная сделать это сама по себе.
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
String.prototype.decodeHTML = function() {
var map = {"gt":">" /* , … */};
return this.replace(/&(#(?:x[0-9a-f]+|\d+)|[a-z]+);?/gi, function($0, $1) {
if ($1[0] === "#") {
return String.fromCharCode($1[1].toLowerCase() === "x" ? parseInt($1.substr(2), 16) : parseInt($1.substr(1), 10));
} else {
return map.hasOwnProperty($1) ? map[$1] : $0;
}
});
};
Ответ 2
function decodeEntities(s){
var str, temp= document.createElement('p');
temp.innerHTML= s;
str= temp.textContent || temp.innerText;
temp=null;
return str;
}
alert(decodeEntities('<'))
/* returned value: (String)
<
*/
Ответ 3
Вот "класс" для декодирования всего HTML-документа.
HTMLDecoder = {
tempElement: document.createElement('span'),
decode: function(html) {
var _self = this;
html.replace(/&(#(?:x[0-9a-f]+|\d+)|[a-z]+);/gi,
function(str) {
_self.tempElement.innerHTML= str;
str = _self.tempElement.textContent || _self.tempElement.innerText;
return str;
}
);
}
}
Обратите внимание, что я использовал регулярное выражение Gumbo для улавливания объектов, но для полноправных документов HTML (или XHTML) вы могли использовать /&[^;]+;/g
.
Ответ 4
Я знаю, что есть библиотеки, но вот несколько решений для браузеров. Они хорошо работают при размещении строк данных объекта html в редактируемых областях человека, где вы хотите, чтобы символы отображались, например textarea или input [type = text].
Я добавляю этот ответ, поскольку мне приходится поддерживать более старые версии IE, и я чувствую, что он завершает исследование и тестирование на несколько дней. Надеюсь, кто-то найдет это полезным.
Сначала это для более современных браузеров, использующих jQuery. Обратите внимание, что это НЕ следует использовать, если вам нужно поддерживать версии IE до 10 (7, 8 или 9), поскольку он будет лишать строки новой строки, оставив вас с одна длинная строка текста.
if (!String.prototype.HTMLDecode) {
String.prototype.HTMLDecode = function () {
var str = this.toString(),
$decoderEl = $('<textarea />');
str = $decoderEl.html(str)
.text()
.replace(/<br((\/)|( \/))?>/gi, "\r\n");
$decoderEl.remove();
return str;
};
}
Этот следующий основан на работе kennebec выше, с некоторыми отличиями, которые в основном относятся к более старым версиям IE. Это не требует jQuery, но по-прежнему требуется браузер.
if (!String.prototype.HTMLDecode) {
String.prototype.HTMLDecode = function () {
var str = this.toString(),
//Create an element for decoding
decoderEl = document.createElement('p');
//Bail if empty, otherwise IE7 will return undefined when
//OR-ing the 2 empty strings from innerText and textContent
if (str.length == 0) {
return str;
}
//convert newlines to <br's> to save them
str = str.replace(/((\r\n)|(\r)|(\n))/gi, " <br/>");
decoderEl.innerHTML = str;
/*
We use innerText first as IE strips newlines out with textContent.
There is said to be a performance hit for this, but sometimes
correctness of data (keeping newlines) must take precedence.
*/
str = decoderEl.innerText || decoderEl.textContent;
//clean up the decoding element
decoderEl = null;
//replace back in the newlines
return str.replace(/<br((\/)|( \/))?>/gi, "\r\n");
};
}
/*
Usage:
var str = ">";
return str.HTMLDecode();
returned value:
(String) >
*/
Ответ 5
В нем ничего нет, но есть много библиотек, которые были написаны для этого.
Здесь - один.
И здесь, который является плагином jQuery.