Конвертировать специальные символы в HTML в Javascript - PullRequest
108 голосов
/ 24 апреля 2009

Кто-нибудь знает, как преобразовать специальные символы в HTML в Javascript?

Пример:

  • & (амперсанд) становится &amp.
  • " (двойная кавычка) становится &quot, если ENT_NOQUOTES не установлено.
  • ' (одинарная кавычка) становится &#039 только при установленном ENT_QUOTES.
  • < (меньше чем) становится &lt.
  • > (больше чем) становится &gt.

Ответы [ 23 ]

202 голосов
/ 24 апреля 2009

На мой взгляд, лучший способ - использовать встроенную в браузер функцию экранирования HTML для обработки многих случаев. Для этого просто создайте элемент в дереве DOM и установите innerText элемента в вашей строке. Затем получите innerHTML элемента. Браузер вернет строку в кодировке HTML.

function HtmlEncode(s)
{
  var el = document.createElement("div");
  el.innerText = el.textContent = s;
  s = el.innerHTML;
  return s;
}

Тестовый прогон:

alert(HtmlEncode('&;\'><"'));

Выход:

&amp;;'&gt;&lt;"

Этот метод выхода из HTML также используется библиотекой Prototype JS , хотя и отличается от упрощенного примера, который я привел.

Примечание: вам все равно нужно будет избегать кавычек (двойных и одиночных) самостоятельно. Вы можете использовать любой из методов, описанных другими здесь.

68 голосов
/ 24 апреля 2009

Вам нужна функция, которая делает что-то вроде

return mystring.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");

Но с учетом вашего желания по-разному обрабатывать одинарные / двойные кавычки.

30 голосов
/ 24 апреля 2009

Эта универсальная функция кодирует каждый не алфавитный символ в свой htmlcode (числовой):

function HTMLEncode(str) {
    var i = str.length,
        aRet = [];

    while (i--) {
        var iC = str[i].charCodeAt();
        if (iC < 65 || iC > 127 || (iC>90 && iC<97)) {
            aRet[i] = '&#'+iC+';';
        } else {
            aRet[i] = str[i];
        }
    }
    return aRet.join('');
}
19 голосов
/ 04 января 2013

Из Мозиллы ...

Обратите внимание, что charCodeAt всегда будет возвращать значение, которое меньше 65 536. Это связано с тем, что более высокие кодовые точки представлены парой (менее значимых) «суррогатных» псевдосимволов, которые используются для составления реального символа. Из-за этого, чтобы исследовать или воспроизводить полный символ для отдельных символов со значением 65 536 и выше, для таких символов необходимо извлечь не только charCodeAt (i), но также charCodeAt (i + 1) (как при проверке / воспроизводит строку с двумя> буквами).

Лучшее решение

/**
 * (c) 2012 Steven Levithan <http://slevithan.com/>
 * MIT license
 */
if (!String.prototype.codePointAt) {
    String.prototype.codePointAt = function (pos) {
        pos = isNaN(pos) ? 0 : pos;
        var str = String(this),
            code = str.charCodeAt(pos),
            next = str.charCodeAt(pos + 1);
        // If a surrogate pair
        if (0xD800 <= code && code <= 0xDBFF && 0xDC00 <= next && next <= 0xDFFF) {
            return ((code - 0xD800) * 0x400) + (next - 0xDC00) + 0x10000;
        }
        return code;
    };
}

/**
 * Encodes special html characters
 * @param string
 * @return {*}
 */
function html_encode(string) {
    var ret_val = '';
    for (var i = 0; i < string.length; i++) { 
        if (string.codePointAt(i) > 127) {
            ret_val += '&#' + string.codePointAt(i) + ';';
        } else {
            ret_val += string.charAt(i);
        }
    }
    return ret_val;
}

Пример использования:

html_encode("✈");
18 голосов
/ 24 апреля 2009

Создать функцию, которая использует строку replace

function convert(str)
{
  str = str.replace(/&/g, "&amp;");
  str = str.replace(/>/g, "&gt;");
  str = str.replace(/</g, "&lt;");
  str = str.replace(/"/g, "&quot;");
  str = str.replace(/'/g, "&#039;");
  return str;
}
6 голосов
/ 03 января 2011
function char_convert() {

    var chars = ["©","Û","®","ž","Ü","Ÿ","Ý","$","Þ","%","¡","ß","¢","à","£","á","À","¤","â","Á","¥","ã","Â","¦","ä","Ã","§","å","Ä","¨","æ","Å","©","ç","Æ","ª","è","Ç","«","é","È","¬","ê","É","­","ë","Ê","®","ì","Ë","¯","í","Ì","°","î","Í","±","ï","Î","²","ð","Ï","³","ñ","Ð","´","ò","Ñ","µ","ó","Õ","¶","ô","Ö","·","õ","Ø","¸","ö","Ù","¹","÷","Ú","º","ø","Û","»","ù","Ü","@","¼","ú","Ý","½","û","Þ","€","¾","ü","ß","¿","ý","à","‚","À","þ","á","ƒ","Á","ÿ","å","„","Â","æ","…","Ã","ç","†","Ä","è","‡","Å","é","ˆ","Æ","ê","‰","Ç","ë","Š","È","ì","‹","É","í","Œ","Ê","î","Ë","ï","Ž","Ì","ð","Í","ñ","Î","ò","‘","Ï","ó","’","Ð","ô","“","Ñ","õ","”","Ò","ö","•","Ó","ø","–","Ô","ù","—","Õ","ú","˜","Ö","û","™","×","ý","š","Ø","þ","›","Ù","ÿ","œ","Ú"]; 
    var codes = ["&copy;","&#219;","&reg;","&#158;","&#220;","&#159;","&#221;","&#36;","&#222;","&#37;","&#161;","&#223;","&#162;","&#224;","&#163;","&#225;","&Agrave;","&#164;","&#226;","&Aacute;","&#165;","&#227;","&Acirc;","&#166;","&#228;","&Atilde;","&#167;","&#229;","&Auml;","&#168;","&#230;","&Aring;","&#169;","&#231;","&AElig;","&#170;","&#232;","&Ccedil;","&#171;","&#233;","&Egrave;","&#172;","&#234;","&Eacute;","&#173;","&#235;","&Ecirc;","&#174;","&#236;","&Euml;","&#175;","&#237;","&Igrave;","&#176;","&#238;","&Iacute;","&#177;","&#239;","&Icirc;","&#178;","&#240;","&Iuml;","&#179;","&#241;","&ETH;","&#180;","&#242;","&Ntilde;","&#181;","&#243;","&Otilde;","&#182;","&#244;","&Ouml;","&#183;","&#245;","&Oslash;","&#184;","&#246;","&Ugrave;","&#185;","&#247;","&Uacute;","&#186;","&#248;","&Ucirc;","&#187;","&#249;","&Uuml;","&#64;","&#188;","&#250;","&Yacute;","&#189;","&#251;","&THORN;","&#128;","&#190;","&#252","&szlig;","&#191;","&#253;","&agrave;","&#130;","&#192;","&#254;","&aacute;","&#131;","&#193;","&#255;","&aring;","&#132;","&#194;","&aelig;","&#133;","&#195;","&ccedil;","&#134;","&#196;","&egrave;","&#135;","&#197;","&eacute;","&#136;","&#198;","&ecirc;","&#137;","&#199;","&euml;","&#138;","&#200;","&igrave;","&#139;","&#201;","&iacute;","&#140;","&#202;","&icirc;","&#203;","&iuml;","&#142;","&#204;","&eth;","&#205;","&ntilde;","&#206;","&ograve;","&#145;","&#207;","&oacute;","&#146;","&#208;","&ocirc;","&#147;","&#209;","&otilde;","&#148;","&#210;","&ouml;","&#149;","&#211;","&oslash;","&#150;","&#212;","&ugrave;","&#151;","&#213;","&uacute;","&#152;","&#214;","&ucirc;","&#153;","&#215;","&yacute;","&#154;","&#216;","&thorn;","&#155;","&#217;","&yuml;","&#156;","&#218;"];

    for(x=0; x<chars.length; x++){
        for (i=0; i<arguments.length; i++){
            arguments[i].value = arguments[i].value.replace(chars[x], codes[x]);
        }
    }
 }

char_convert(this);
6 голосов
/ 30 января 2010
function ConvChar( str ) {
  c = {'<':'&lt;', '>':'&gt;', '&':'&amp;', '"':'&quot;', "'":'&#039;',
       '#':'&#035;' };
  return str.replace( /[<&>'"#]/g, function(s) { return c[s]; } );
}

alert( ConvChar('<-"-&-"->-<-\'-#-\'->') );

Результат:

&lt;-&quot;-&ampamp;-&quot;-&gt;-&lt;-&#039;-&#035;-&#039;-&gt;

В теге testarea:

<-"-&-"->-<-'-#-'->

Если вы просто измените немного символов в длинном коде ...

4 голосов
/ 21 сентября 2012

В теге PRE - и в большинстве других тегов HTML - обычный текст для пакетного файла, который использует символы перенаправления вывода (<и>), нарушит HTML, но вот мой совет : что-то идет в элементе TEXTAREA - это не сломает HTML, главным образом потому, что мы находимся внутри элемента управления, который создается и обрабатывается ОС, и поэтому его содержимое не анализируется механизмом HTML.

В качестве примера, скажем, я хочу выделить синтаксис моего командного файла, используя javascript. Я просто вставляю код в текстовую область, не беспокоясь о зарезервированных символах HTML, и заставляю сценарий обрабатывать свойство innerHTML текстовой области, которое оценивается как текст с зарезервированными символами HTML, замененными их соответствующими объектами ISO-8859-1. .

Браузеры автоматически экранируют специальные символы при извлечении свойства innerHTMLouterHTML) элемента. Использование текстовой области (и кто знает, может быть, ввод текста типа) просто избавляет вас от преобразования (вручную или с помощью кода).

Я использую этот трюк для проверки подсветки синтаксиса, а когда я закончу разработку и тестирование, я просто скрываю текстовую область от просмотра.

4 голосов
/ 11 декабря 2013

Как упоминалось dragon, самый чистый способ сделать это с jQuery:

function HtmlEncode(s) {
    return $('<div>').text(s).html();
}

function HtmlDecode(s) {
    return $('<div>').html(s).text();
}
3 голосов
/ 28 февраля 2013

обходной путь:

var temp = $("div").text("<");
var afterEscape = temp.html(); // afterEscape == "&lt;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...