Перетворення спеціальних символів у HTML у Javascript


121

Хтось знає, як перетворити спеціальні символи HTMLвJavascript ?

Приклад:

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

дивіться також: stackoverflow.com/questions/1354064
Кріс

Ви можете використовувати цю бібліотеку: npmjs.com/package/utf8
Camilo Ortegón

Відповіді:


77

Вам потрібна функція, яка виконує щось подібне

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

Але з урахуванням вашого прагнення до різного поводження з одинарними / подвійними цитатами.


що робить похила г?
JohnnyBizzle

5
@JohnnyBizzle /gв регулярному виразі означає "глобальний". Простіше кажучи, всі входження рядка будуть замінені. Без /gпершого матчу було б замінено.
Кевін Гімбель

207

Найкращий спосіб, на мою думку, - використовувати вбудовану функціональну функцію введення браузера в 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 використовується також бібліотекою прототипів JS хоча інакше від спрощеного зразка, який я дав.

Примітка: Вам все одно доведеться уникати цитат (подвійних та одинарних) самостійно. Тут ви можете використовувати будь-який із методів, окреслених іншими.


3
зауважте, що delete elтут помилка. perfectionkills.com/understanding-delete
gblazex

Це нічого не робить для мене, коли я намагаюся. Я повертаю персонажів незмінними.
Мосс

1
Вибачте, я тестував чудернацькі символи, а також Chrome підлий і не показує вам реальний вихід HTML, але Firebug (насправді він показав html-сутність для символу авторських прав, коли створене джерело не кодує його). Це добре працює, <>&але не так охоплює рішення, як рішення Neotropic або KooiInc.
Мосс

20
з jQuery,output = $('<div>').text(input).html()
дракон

6
Обидва способи не перетворюють "у &"; і "into"; Так це все ще може використовуватися для атак XSS.
Хтось

32

Ця загальна функція кодує кожен не алфавітний символ до його html-коду (числового):

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('');
}

Це звучить дуже розумно, але я можу змусити його лише перетворити основи:<>&
Мосс

нвм. Вона працює в консольній формі, але коли ви виходите в браузер, схоже, що вона не перетворила матеріал. Що з цим?
Мосс

@Moss: браузер надає символи, кодовані htmlen, символам, які вони представляють. Перевага символів, що кодуються html, полягає в тому, що браузер не повинен здогадуватися про переклад (наприклад) діакритичних символів і, таким чином, завжди робить ці символи так, як вони повинні бути надані.
KooiInc

Ви можете розглянути можливість змінити це, щоб видалити доступ, схожий на масив, з str. IE7 і нижче не підтримують це, і ви можете так само легко викликати charCodeAt прямо з str з i як аргумент. var iC = str.charCodeAt(i)
Чейз

Цей код не створює правильного значення HTML-сутності для символу ±, який має бути & # 177; але це повертається & # 65533; що є невідомим символом .
Пол,

21

Від Mozilla ...

Зауважте, що charCodeAt завжди буде повертати значення, яке менше 65536. Це тому, що більш високі кодові точки представлені парою (суттєво оцінених) псевдо-символів, які використовуються для складання реального символу. Через це, для того, щоб вивчити або відтворити повний символ для окремих символів значенням 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("✈");

21

Створіть функцію, яка використовує рядок 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;
}

Я зіткнувся з проблемою, що в моєму вхідному значенні відображаються лише одиничні лапки (') та подвійні лапки ("). Сценарій зламався, якщо користувач додав його.
Дхарам Малі,

13

Для тих, хто хоче розшифрувати цілий char код, як &#xxx;усередині рядка, скористайтеся цією функцією:

function decodeHtmlCharCodes(str) { 
  return str.replace(/(&#(\d+);)/g, function(match, capture, charCode) {
    return String.fromCharCode(charCode);
  });
}

// Will output "The show that gained int’l reputation’!"
console.log(decodeHtmlCharCodes('The show that gained int&#8217;l reputation&#8217;!'));

ES6

const decodeHtmlCharCodes = str => 
  str.replace(/(&#(\d+);)/g, (match, capture, charCode) => 
    String.fromCharCode(charCode));

// Will output "The show that gained int’l reputation’!"
console.log(decodeHtmlCharCodes('The show that gained int&#8217;l reputation&#8217;!'));


3
Це має бути прийнятою відповіддю, оскільки це розшифрує все.
Quesofat

Це відповідь, яку я шукав. Дякую.
Дзеніс Х.

8
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);

1
Це чудово працює. Але чомусь у поєднанні з деякою функціональністю JQuery, це оскаржується. Іноді перетворює якусь або лише пару. Але загалом, чудово працює. onBlur = "char_convert (це);"
Неотропний

Так, я отримую помилку "Uncaught TypeError: Неможливо викликати метод" замінити "невизначеним" в Chrome і "аргументи [i]. Значення не визначено" в Firebug.
Мосс

розміщувати всі ці спеціальні символи у подібному масиві абсолютно безглуздо. дивіться інші відповіді.
Гавін

Найкраще рішення для мене, єдине, яке перетворює í в & iacute; наприклад.
Едхоулер

Як дістати ці символи з клавіатури? Я знаю, що це дурний приклад питання ... наприклад, в OS X
PositiveGuy

7

Як зазначалося dragonнайчистішим способом зробити це jQuery:

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

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

Цікаво, але якщо ваш рядок містить пробіл, це не змінить його. Кращий спосіб - використовувати encodeURI (yourString);
Майк Гледхілл

6
функція ConvChar (str) {
  c = {'<': '& lt;', '>': '& gt;', '&': '& amp;', "": "& quot; '" "":' & # 039; ',
       '#': '& # 035;' };
  return str.replace (/ [<&> '"#] / g, функція (и) {return c [s];});
}

попередження (ConvChar ('<- "- & -" -> - <- \' - # - \ '->'));

Результат:

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

У тестареї тег:

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

Якщо ви просто зміните невеликі символи у довгому коді ...


4

У PREтезі - і в більшості інших тегів HTML - звичайний текст для пакетного файлу, який використовує символи переадресації виводу (<і>), порушить HTML, але ось моя порада : все, що йде в TEXTAREAелементі, - не порушить пробіл HTML, головним чином тому, що ми знаходимось у керуванні, встановленому операційною системою та обробляється ОС, і тому його вміст не аналізується механізмом HTML.

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

Під час отримання innerHTMLouterHTML) властивості елемента браузери автоматично уникають спеціальних символів . Використання текстової області (і хто це знає, можливо, введення тексту тексту) просто врятує вас від перетворення (вручну або через код).

Я використовую цей трюк для тестування мого синтаксису підсвічувачем, і коли я закінчую авторство та тестування, я просто приховую текстові області від перегляду.


3

Якщо вам потрібна підтримка всіх стандартизованих посилань на символи , однокоректні та неоднозначні амперсанди , бібліотека he - це єдине 100% надійне рішення, про яке я знаю!


Приклад використання

he.encode('foo © bar ≠ baz 𝌆 qux'); 
// Output : 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'

he.decode('foo &copy; bar &ne; baz &#x1D306; qux');
// Output : 'foo © bar ≠ baz 𝌆 qux'

3

вирішення:

var temp = $("div").text("<");
var afterEscape = temp.html(); // afterEscape == "&lt;"

2
var swapCodes   = new Array(8211, 8212, 8216, 8217, 8220, 8221, 8226, 8230, 8482, 169, 61558, 8226, 61607);
var swapStrings = new Array("--", "--", "'",  "'",  '"',  '"',  "*",  "...", "&trade;", "&copy;", "&bull;", "&bull;", "&bull;");

var TextCheck = {
    doCWBind:function(div){
        $(div).bind({
            bind:function(){
                TextCheck.cleanWord(div);
            },
            focus:function(){
                TextCheck.cleanWord(div);
            },
            paste:function(){
                TextCheck.cleanWord(div);
            }
        }); 
    },
    cleanWord:function(div){
        var output = $(div).val();
        for (i = 0; i < swapCodes.length; i++) {
            var swapper = new RegExp("\\u" + swapCodes[i].toString(16), "g");
            output = output.replace(swapper, swapStrings[i]);
        }
        $(div).val(output);
    }
}

Ще один, який ми використовуємо зараз, працює. Один з вище, я називаю сценарій замість цього і повертає перетворений код. Корисний лише для невеликих текстових повідомлень (мається на увазі не повний текст у статті / блозі ...)


Для вище. Працює на більшості знаків.

var swapCodes   = new Array(8211, 8212, 8216, 8217, 8220, 8221, 8226, 8230, 8482, 61558, 8226, 61607,161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376, 402);
var swapStrings = new Array("--", "--", "'",  "'",  '"',  '"',  "*",  "...", "&trade;", "&bull;", "&bull;", "&bull;", "&iexcl;", "&cent;", "&pound;", "&curren;", "&yen;", "&brvbar;", "&sect;", "&uml;", "&copy;", "&ordf;", "&laquo;", "&not;", "&shy;", "&reg;", "&macr;", "&deg;", "&plusmn;", "&sup2;", "&sup3;", "&acute;", "&micro;", "&para;", "&middot;", "&cedil;", "&sup1;", "&ordm;", "&raquo;", "&frac14;", "&frac12;", "&frac34;", "&iquest;", "&Agrave;", "&Aacute;", "&Acirc;", "&Atilde;", "&Auml;", "&Aring;", "&AElig;", "&Ccedil;", "&Egrave;", "&Eacute;", "&Ecirc;", "&Euml;", "&Igrave;", "&Iacute;", "&Icirc;", "&Iuml;", "&ETH;", "&Ntilde;", "&Ograve;", "&Oacute;", "&Ocirc;", "&Otilde;", "&Ouml;", "&times;", "&Oslash;", "&Ugrave;", "&Uacute;", "&Ucirc;", "&Uuml;", "&Yacute;", "&THORN;", "&szlig;", "&agrave;", "&aacute;", "&acirc;", "&atilde;", "&auml;", "&aring;", "&aelig;", "&ccedil;", "&egrave;", "&eacute;", "&ecirc;", "&euml;", "&igrave;", "&iacute;", "&icirc;", "&iuml;", "&eth;", "&ntilde;", "&ograve;", "&oacute;", "&ocirc;", "&otilde;", "&ouml;", "&divide;", "&oslash;", "&ugrave;", "&uacute;", "&ucirc;", "&uuml;", "&yacute;", "&thorn;", "&yuml;", "&#338;", "&#339;", "&#352;", "&#353;", "&#376;", "&#402;");

Я створюю файл JavaScript, який має багато функціональних можливостей, включаючи вищевказане. http://www.neotropicsolutions.com/JSChars.zip

Всі необхідні файли включені. Я додав jQuery 1.4.4. Просто тому, що я бачив проблеми в інших версіях, але все ж, щоб їх випробувати.

Requires: jQuery & jQuery Impromptu from: http://trentrichardson.com/Impromptu/index.php

1. Word Count
2. Character Conversion
3. Checks to ensure this is not passed: "notsomeverylongstringmissingspaces"
4. Checks to make sure ALL IS NOT ALL UPPERCASE.
5. Strip HTML

    // Word Counter
    $.getScript('js/characters.js',function(){
            $('#adtxt').bind("keyup click blur focus change paste",
                function(event){
                    TextCheck.wordCount(30, "#adtxt", "#adtxt_count", event);
            });
            $('#adtxt').blur(
                function(event){
                    TextCheck.check_length('#adtxt'); // unsures properly spaces-not one long word
                    TextCheck.doCWBind('#adtxt');// char conversion
            });

            TextCheck.wordCount(30, "#adtxt", "#adtxt_count", false);
        });

    //HTML
    <textarea name="adtxt" id="adtxt" rows="10" cols="70" class="wordCount"></textarea>
<div id="adtxt_count" class="clear"></div>

    // Just Character Conversions:
    TextCheck.doCWBind('#myfield');

    // Run through form fields in a form for case checking.
    // Alerts user when field is blur'd.
    var labels = new Array("Brief Description","Website URL","Contact Name","Website","Email","Linkback URL");
    var checking = new Array("descr","title","fname","website","email","linkback");
    TextCheck.check_it(checking,labels);

    // Extra security to check again, make sure form is not submitted
    var pass = TextCheck.validate(checking,labels);
    if(pass){
        //do form actions
    }


    //Strip HTML
    <textarea name="adtxt" id="adtxt" rows="10" cols="70" onblur="TextCheck.stripHTML(this);"></textarea>

2
 <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>html</title>  
      <script>
      $(function() {   
      document.getElementById('test').innerHTML = "&amp;";
      });

      </script>
    </head>
    <body>
    <div id="test"></div>
    </body>
    </html>

ви можете просто перетворити спеціальні символи в HTML, використовуючи вищевказаний код.


2

Ось гарна бібліотека, яку я вважав дуже корисною в цьому контексті.

https://github.com/mathiasbynens/he

За словами її автора:

Він підтримує всі стандартизовані посилання на іменовані символи відповідно до HTML, обробляє неоднозначні розширення та інші крайові випадки, як у веб-переглядачі, має великий тестовий набір і - всупереч багатьом іншим рішенням JavaScript - він добре обробляє астральні символи Unicode.


Цей інструмент github.com/mathiasbynens/he для mathias - це дуже добре, також є онлайн-майданчик
Мохамед Хуссей

1

Ось кілька методів, якими я користуюся без необхідності Jquery:

Ви можете кодувати кожен символ у рядку:

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}

Або просто націліть на основні символи безпечного кодування, щоб потурбуватися про (&, undebreaks, <,>, "і '), наприклад:

function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}

test.value=encode('How to encode\nonly html tags &<>\'" nice & fast!');

/*************
* \x26 is &ampersand (it has to be first),
* \x0A is newline,
*************/
<textarea id=test rows="9" cols="55">www.WHAK.com</textarea>


0
function escape (text)
{
  return text.replace(/[<>\&\"\']/g, function(c) {
    return '&#' + c.charCodeAt(0) + ';';
  });
}

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

0

Це прямо не відповідає на ваше запитання, але якщо ви використовуєте innerHTMLдля того, щоб написати текст всередині елемента, і ви зіткнулися з проблемами кодування, просто використовуйте textContent, тобто:

var s = "Foo 'bar' baz <qux>";

var element = document.getElementById('foo');
element.textContent = s;

// <div id="foo">Foo 'bar' baz <qux></div>

0

Ми можемо використовувати javascript DOMParserдля перетворення спеціальних символів.

const parser = new DOMParser();
const convertedValue = (parser.parseFromString("&#039 &amp &#039 &lt &gt", "application/xml").body.innerText;

0

Далі йде проста функція кодування xml-знаків втечі в JS

Encoder.htmlEncode (unsafeText);


0

Ви можете виправити це, замінивши функцію .text () на .html (). це працює для мене.


-1
<html>
<body>
<script type="text/javascript">
var str= "&\"'<>";
alert('B4 Change:\n' + str);
str= str.replace(/\&/g,'&amp;');
str= str.replace(/</g,'&lt;');
str= str.replace(/>/g,'&gt;');
str= str.replace(/\"/g,'&quot;');
str= str.replace(/\'/g,'&#039;');
alert('After change:\n' + str);
</script>
</body>
</html>      

використовуйте це для тестування: http://www.w3schools.com/js/tryit.asp?filename=tryjs_text


-1

Так, але якщо вам потрібно вставити отриманий рядок десь без його перетворення назад, вам потрібно зробити:

str.replace(/'/g,"&amp;amp;#39;"); // and so on


-4

Використовуйте функцію javaScript функція escape () , яка дозволяє кодувати рядки.

наприклад,

escape("yourString");

1
Кодування для введення URL-адреси не для HTML (а функція все одно застаріла, оскільки вона порушена для Unicode).
Квентін

-4
public static string HtmlEncode (string text)
{
    string result;
    using (StringWriter sw = new StringWriter())
    {
        var x = new HtmlTextWriter(sw);
        x.WriteEncodedText(text);
        result = sw.ToString();
    }
    return result;

}

Це рішення навіть код Javascript? Бо мені схоже на JAVA або C #.
Mr.TK

Це не JavaScript.
Дієго Фортес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.