자바 스크립트로 HTML 엔티티 인코딩


108

사용자가 콘텐츠를 입력 할 수있는 CMS에서 일하고 있습니다. 문제는 기호를 추가 할 때 ®모든 브라우저에서 제대로 표시되지 않을 수 있다는 것입니다. 검색해야하는 기호 목록을 설정 한 다음 해당 html 엔티티로 변환하고 싶습니다. 예를 들면

® => ®
& => &
© => ©
™ =>™

변환 후 <sup>태그 로 래핑해야 하므로 결과는 다음과 같습니다.

® => <sup>&reg;</sup>

특정 글꼴 크기 및 패딩 스타일이 필요하기 때문에 :

sup { font-size: 0.6em; padding-top: 0.2em; }

자바 스크립트가 이와 비슷할까요?

var regs = document.querySelectorAll('®');
  for ( var i = 0, l = imgs.length; i < l; ++i ) {
  var [?] = regs[i];
  var [?] = document.createElement('sup');
  img.parentNode.insertBefore([?]);
  div.appendChild([?]);
}

여기서 "[?]"는 확실하지 않은 것이 있음을 의미합니다.

추가 세부 사항:

  • jQuery와 같은 라이브러리가 필요한 것이 아니라 순수한 JavaScript로이 작업을 수행하고 싶습니다. 감사합니다.
  • 백엔드는 Ruby입니다.
  • Ruby on Rails로 빌드 된 RefineryCMS 사용

백엔드는 무엇입니까? PHP라면이를 처리하는 기능이 있으며 다른 언어에도 해당 기능이 있다고 확신합니다. 또한 Google : developwithstyle.com/articles/2010/06/29/…
Chris Baker

5
더 나은 해결책은 UTF-8로 인코딩 된 텍스트를 받아 출력하는 것입니다. 오늘날 사용되는 모든 브라우저는 UTF-8을 지원합니다. 는 HTML 측면에서, 당신은 추가 할 것입니다 accept-charset="UTF-8"당신에 <form>태그입니다. 서버에서 출력이 UTF-8로 인코딩되고 웹 서버가 ( Content-Type헤더 를 통해) 브라우저에이를 알리는 지 확인하고 싶을 것 입니다. rentzsch.tumblr.com/post/9133498042/…를 참조하십시오. 이 모든 작업을 수행하고 브라우저가 문자를 올바르게 표시하지 않으면 문자를 엔티티로 대체해도 아무런 차이가 없습니다.
Paul D. Waite 2013 년

@Chris는 Ruby on Rails로 구축 된 CMS에서 작업합니다.
JGallardo

클라이언트 측 JavaScript는 엔티티가 존재하지 않는 DOM에서 작동하기 때문에 클라이언트 측 JavaScript에서 문자를 HTML 엔티티 참조로 변경하는 것은 잘못되었습니다. "®"을 sup요소 로 래핑 하면 해결할 수있는 것보다 더 많은 문제가 발생하는 경향이 있습니다. 많은 글꼴에서 "®"이 작고 아래 첨자 위치에 있으므로 인식 할 수없는 것으로 줄입니다.
Jukka K. Korpela

@ JukkaK.Korpela, 일부 html 엔터티가 제대로 표시되지 않는 문제를 해결해야한다는 점을 고려할 때 어떻게 해결 하시겠습니까? 그리고 <sup>블로그 게시물에 사용 된 특정 글꼴을 테스트했기 때문에 줄 바꿈 은 문제가되지 않지만 고려할 좋은 점입니다.
JGallardo

답변:


180

정규식을 사용하여 주어진 유니 코드 범위의 모든 문자를 해당하는 html 엔티티로 바꿀 수 있습니다. 코드는 다음과 같습니다.

var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) {
   return '&#'+i.charCodeAt(0)+';';
});

단순히 인 자신의 HTML 엔티티 등가물로 -이 코드는 지정된 범위의 모든 문자 (9999뿐만 아니라, 앰퍼샌드, 큰 및 미만 유니 코드 00A0)를 대체 할 &#nnn;경우 nnn유니 코드 값을 우리가에서 얻을 수있다 charCodeAt.

: 여기에 직접보기 http://jsfiddle.net/E3EqX/13/ (이 예는 예에서 사용 된 요소 선택기 jQuery를 사용하는 기본 코드 자체, 위, jQuery를 사용하지 않습니다.)

이러한 변환을 수행한다고해서 모든 문제가 해결되는 것은 아닙니다. UTF8 문자 인코딩을 사용하고 있는지 확인하고 데이터베이스가 문자열을 UTF8로 저장하고 있는지 확인하세요. 당신은 여전히 문자가 당신의 통제 시스템 글꼴 설정 및 기타 문제에 따라 제대로 표시되지 않는 경우를 볼 수 있습니다.

선적 서류 비치


jsfiddle 주셔서 감사합니다. 그래서 이것을 구현합니다. 나는 이것을 내 .js파일에 추가하고 다른 것들을 추가하여 <sup>?
JGallardo

2
@JGallardo 저는 예제를 약간 다시 작성하여 sup태그 (또는 다른 태그)를 추가하고 jsfiddle.net/E3EqX/4 함수에 포함됩니다 . 이를 사용하려면 "encodeAndWrap"함수를 프로젝트에 복사해야합니다.
Chris Baker

1
@Chris는 깔끔한 코드 스 니펫에 감사를 표합니다.하지만 버그가 하나 있습니다. "[\ u00A0- \ u99999]"는 예상했던 작업을 수행하지 않고 "[\ u00A0- \ u9999] | 9 "-즉. 문자 "9"도 HTML 엔티티로 잘못 대체됩니다. 바이올린에서도 시도해 볼 수 있습니다. 대답에 대한 수정을 제안하겠습니다.
SB

@SB 메모 감사합니다. 최종 승인 투표도했습니다. :)
Chris Baker

1
@mathias Bynens의 답변이 더 완벽하다는 데 동의하지만 그의 솔루션은 84KB이므로 계속해서 대안을 찾고 있습니다. 이것은 괜찮아 보이지만 charCodes <65 및> 90 && <97?
Florian Mertens 2014

63

현재 받아 들여지는 답변 에는 몇 가지 문제가 있습니다. 이 게시물에서는 이에 대해 설명하고보다 강력한 솔루션을 제공합니다. 이전에 그 답변에서 제안한 솔루션은 다음과 같습니다.

var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
  return '&#' + i.charCodeAt(0) + ';';
});

i플래그 U + U + 00A0에서 9999의 범위에는 유니 코드 심볼이 없기 때문에 중복 대문자 / 소문자 변형 밖에 동일한 범위된다.

m때문에 플래그는 중복 ^또는 $정규 표현식에서 사용되지 않습니다.

왜 U + 00A0에서 U + 9999까지의 범위입니까? 임의적으로 보입니다.

어쨌든, 입력에서 안전하고 인쇄 가능한 ASCII 기호 (아스트랄 기호 포함!)를 제외한 모든 것을 올바르게 인코딩 하고 모든 명명 된 문자 참조 (HTML4의 참조가 아님)를 구현 하는 솔루션의 경우 he 라이브러리를 사용하십시오 (면책 조항 :이 라이브러리는 내 것입니다). ). README에서 :

he ( "HTML 엔티티"의 경우)는 JavaScript로 작성된 강력한 HTML 엔티티 인코더 / 디코더입니다. 그것은 지원하는 HTML에 따라 모든 표준화라는 문자 참조를 , 핸들 모호한 앰퍼샌드 와 다른 에지의 경우 단지 브라우저 같은 것 , 광범위한 테스트 스위트 및이 - - 다른 많은 자바 스크립트 솔루션에 반하는 그가 잘 아스트랄 유니 코드 문자를 처리합니다. 온라인 데모를 사용할 수 있습니다.

이 관련 Stack Overflow 답변 도 참조하십시오 .


12
또한 HE 라이브러리는 ... 84KB! Autch ... 덜 연결되어있는 휴대 전화로 다운로드 해보세요. 타협은 어딘가에을 만들 수있다 ..
플로리안 메르 탕에게

1
@FlorianMertens 축소 + gzip 후 그는 ~ 24KB입니다. 여전히 크지 만 HTML 엔티티를 올바르게 디코딩하려면 하루가 끝날 때 모든 데이터가 필요합니다.이를 해결할 방법이 없습니다. 성능에 영향을주지 않고 라이브러리를 작게 만드는 방법을 찾을 수 있다면 풀 요청을 제출하십시오.
Mathias Bynens 2014

2
@MathiasBynens, 아니 라이브러리가 좋은 의심하지하지만 당신은 허용 답변에 문제를 강조하기 위해 주석 상자를 사용하여 코드 블록에 개선 답을 제출하십시오 수 있습니다
diEcho

3
@drzaus 이미지는 많은 데이터를 저장하고 압축 된 데이터가 적을수록 디코딩 속도가 빠르기 때문에 크기가 커지지 않습니다. 그러나 프로그램 코드는 다르며 매우 자주 전체 라이브러리가 추가되고 거의 사용되지 않습니다. 라이브러리의 코드는 때때로 자신의 코드보다 더 많은 줄을 포함합니다! 게다가 lib 문제를 찾고 / 디버그하고 버그 보고서를 보내거나 심지어 lib를 업데이트하는 것을 귀찮게하는 사람은 거의 없으므로 검사되지 않은 코드로 많은 lib가있는 소프트웨어에서 메모리 누수 또는 기타 문제가 지속될 수 있습니다. 누군가 html 안전하지 않은 문자를 인코딩 / 이스케이프하려는 경우 80kb가 아닌 몇 줄만 필요합니다.
bryc

1
@MarcoKlein 그래, 내 게시물에서 설명합니다. 실제로 버그가있는 코드 조각이 겪는 문제입니다. 내가 지적한 해결책에는 그 문제가 없습니다. ( "아스트랄 기호 포함!"참조)
Mathias Bynens

29

나는 같은 문제가 있었고 엔티티를 생성하고 다시 일반 문자로 변환하는 2 개의 함수를 만들었습니다. 다음 메소드는 모든 문자열을 HTML 엔티티로 변환하고 다시 문자열 프로토 타입으로 변환합니다.

/**
 * Convert a string to HTML entities
 */
String.prototype.toHtmlEntities = function() {
    return this.replace(/./gm, function(s) {
        // return "&#" + s.charCodeAt(0) + ";";
        return (s.match(/[a-z0-9\s]+/i)) ? s : "&#" + s.charCodeAt(0) + ";";
    });
};

/**
 * Create string from HTML entities
 */
String.fromHtmlEntities = function(string) {
    return (string+"").replace(/&#\d+;/gm,function(s) {
        return String.fromCharCode(s.match(/\d+/gm)[0]);
    })
};

그런 다음 다음과 같이 사용할 수 있습니다.

var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æøπ£¨ ƒ™en tést".toHtmlEntities();
console.log("Entities:", str);
console.log("String:", String.fromHtmlEntities(str));

콘솔 출력 :

Entities: &#68;&#105;&#116;&#32;&#105;&#115;&#32;&#101;&#180;&#8224;&#174;&#165;&#168;&#169;&#729;&#8747;&#248;&#8230;&#710;&#402;&#8710;&#247;&#8721;&#8482;&#402;&#8710;&#230;&#248;&#960;&#163;&#168;&#160;&#402;&#8482;&#101;&#110;&#32;&#116;&#163;&#101;&#233;&#115;&#116;
String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æøπ£¨ ƒ™en t£eést 

이 솔루션은 tvOS에서도 작동하므로 모든 경우에 인코딩 문제를 잘 해결할 수 있습니다.
loretoparisi

4
조금 극단적이지 않나요? 모든 것을 HTML 엔티티 로 변환 하고 있습니다. "abc", "123"과 같은 "안전한"문자도 ... 심지어 공백까지
AJPerez

1
이것은 잘못된 대답입니다. 웹 문서의 50 % 이상은 주로 latin1과 utf-8을 포함합니다. 안전한 문자 인코딩은 아무런 이점없이 크기를 500 %에서 600 %까지 증가시킵니다.
HoldOffHunger

m앵커가없는 패턴에서 패턴 수정 자의 목적을 설명하십시오 . 그래서 s점을 포함하는 패턴 에 사용한다는 뜻 입니까?
mickmackusa 2010

20

라이브러리없이 IE <9를 지원할 필요가없는 경우 html 요소를 만들고 Node.textContent로 콘텐츠를 설정할 수 있습니다 .

var str = "<this is not a tag>";
var p = document.createElement("p");
p.textContent = str;
var converted = p.innerHTML;

예 : https://jsfiddle.net/1erdhehv/

업데이트 : HTML 태그 엔티티 (&, <,>)에서만 작동합니다.


2
textContent 대신 innerText를 사용하지 않는 이유는 무엇입니까?

@Rick, 답변에 링크 된 textContent에 대한 MDN 문서를 제공합니다. "textContent 및 HTMLElement.innerText는 쉽게 혼동되지만 두 속성은 중요한면에서 다릅니다 ."
Adarsha

이것은 훌륭한 해결책이지만 "문자를 제대로 인코딩하지 않습니다.
Andreas

당신이 옳습니다. 이 솔루션은 html 태그 문자 (<,>, /)에서만 작동하는 것 같습니다. 나는 그것을 제거하고 싶다.
antoineMoPa

19

이것을 사용할 수 있습니다.

var escapeChars = {
  '¢' : 'cent',
  '£' : 'pound',
  '¥' : 'yen',
  '€': 'euro',
  '©' :'copy',
  '®' : 'reg',
  '<' : 'lt',
  '>' : 'gt',
  '"' : 'quot',
  '&' : 'amp',
  '\'' : '#39'
};

var regexString = '[';
for(var key in escapeChars) {
  regexString += key;
}
regexString += ']';

var regex = new RegExp( regexString, 'g');

function escapeHTML(str) {
  return str.replace(regex, function(m) {
    return '&' + escapeChars[m] + ';';
  });
};

https://github.com/epeli/underscore.string/blob/master/escapeHTML.js

var htmlEntities = {
    nbsp: ' ',
    cent: '¢',
    pound: '£',
    yen: '¥',
    euro: '€',
    copy: '©',
    reg: '®',
    lt: '<',
    gt: '>',
    quot: '"',
    amp: '&',
    apos: '\''
};

function unescapeHTML(str) {
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
        var match;

        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
            /*eslint no-cond-assign: 0*/
        } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
            /*eslint no-cond-assign: 0*/
        } else if (match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};

4
인코딩 가능한 문자의 무작위 하위 집합을 수동으로 추가하면 자신과 동료에게 문제가 생길 수 있습니다. 문자를 인코딩해야하는 단일 기관이 있어야합니다. 아마도 브라우저 나 포괄적이고 유지 관리 될 가능성이있는 특정 라이브러리가 실패 할 것입니다.
user234461

1
@ user234461입니다. 누구든지 그 하나의 권위를 발견한다면, (나와 같은) 호기심 많은 사람들은 알고 싶어 할 것입니다!
idungotnosn

1
이것은 HTML 엔티티의 많은으로 sunch 그리워합니다 &rdquo; &uuml; &scaron;: 모든 HTML 엔티티의 comprihensive 목록은 아주 긴 등 freeformatter.com/html-entities.html
lofihelsinki

7

HTML 엔터티를 두 번 이상 인코딩하지 않으려면

function encodeHTML(str){
    return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, function(full, char, next) {
      if(char !== '&' || next !== '#'){
        if(/[\u00A0-\u9999<>&]/.test(next))
          next = '&#' + next.charCodeAt(0) + ';';

        return '&#' + char.charCodeAt(0) + ';' + next;
      }

      return full;
    });
}

function decodeHTML(str){
    return str.replace(/&#([0-9]+);/g, function(full, int) {
        return String.fromCharCode(parseInt(int));
    });
}

# 예

var text = "<a>Content &#169; <#>&<&#># </a>";

text = encodeHTML(text);
console.log("Encode 1 times: " + text);

// &#60;a&#62;Content &#169; &#60;#&#62;&#38;&#60;&#38;#&#62;# &#60;/a&#62;

text = encodeHTML(text);
console.log("Encode 2 times: " + text);

// &#60;a&#62;Content &#169; &#60;#&#62;&#38;&#60;&#38;#&#62;# &#60;/a&#62;

text = decodeHTML(text);
console.log("Decoded: " + text);

// <a>Content © <#>&<&#># </a>

이것은 부분적으로 이스케이프 처리 된 텍스트가 혼합 된 경우에만 유용하며 모든 문자열을 올바르게 인코딩 할 수 없기 때문에 버그 <#>가 발생합니다. 다음과 같이 나올 것입니다.<#&#62;
Rick

@Rick 그것에 대해 알려 주셔서 감사합니다. 더 나아질 수 있도록 답변을 업데이트했습니다.
StefansArya

4

HTML 특수 문자 및 해당 ESCAPE CODES

예약 된 문자는 HTML로 이스케이프해야합니다. ASCII 문자 만 사용하여 HTML, XHTML 또는 XML에서 유니 코드 문자 [예 : &-U + 00026]를 나타내는 데 문자 이스케이프를 사용할 수 있습니다. 숫자 참조 [ 예 : 앰퍼샌드 (&)- &#38;] & 명명 된 문자 참조 [예 : &amp;]는 character escape used in markup.


미리 정의 된 엔티티

    Original Character     XML entity replacement    XML numeric replacement  
                  <                                    &lt;                                           &#60;                    
                  >                                     &gt;                                         &#62;                    
                  "                                     &quot;                                      &#34;                    
                  &                                   &amp;                                       &#38;                    
                   '                                    &apos;                                      &#39;                    

웹 페이지에서 HTML 태그를 일반 형식으로 표시하기 위해 <pre>, <code>태그를 사용 하거나 이스케이프 할 수 있습니다. 의 임의의 발생에 의한 교체 문자열 이스케이프 "&"문자열이 문자 "&amp;"및 임의 발생 ">"문자열이 문자 "&gt;". 전의:stackoverflow post

function escapeCharEntities() {
    var map = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'": "&apos;"
    };
    return map;
}

var mapkeys = '', mapvalues = '';
var html = {
    encodeRex : function () {
        return  new RegExp(mapkeys, 'g'); // "[&<>"']"
    }, 
    decodeRex : function () {
        return  new RegExp(mapvalues, 'g'); // "(&amp;|&lt;|&gt;|&quot;|&apos;)"
    },
    encodeMap : JSON.parse( JSON.stringify( escapeCharEntities () ) ), // json = {&: "&amp;", <: "&lt;", >: "&gt;", ": "&quot;", ': "&apos;"}
    decodeMap : JSON.parse( JSON.stringify( swapJsonKeyValues( escapeCharEntities () ) ) ),
    encode : function ( str ) {
        var encodeRexs = html.encodeRex();
        console.log('Encode Rex: ', encodeRexs); // /[&<>"']/gm
        return str.replace(encodeRexs, function(m) { console.log('Encode M: ', m); return html.encodeMap[m]; }); // m = < " > SpecialChars
    },
    decode : function ( str ) {
        var decodeRexs = html.decodeRex();
        console.log('Decode Rex: ', decodeRexs); // /(&amp;|&lt;|&gt;|&quot;|&apos;)/g
        return str.replace(decodeRexs, function(m) { console.log('Decode M: ', m); return html.decodeMap[m]; }); // m = &lt; &quot; &gt;
    }
};

function swapJsonKeyValues ( json ) {
    var count = Object.keys( json ).length;
    var obj = {};
    var keys = '[', val = '(', keysCount = 1;
    for(var key in json) {
        if ( json.hasOwnProperty( key ) ) {
            obj[ json[ key ] ] = key;
            keys += key;
            if( keysCount < count ) {
                val += json[ key ]+'|';
            } else {
                val += json[ key ];
            }
            keysCount++;
        }
    }
    keys += ']';    val  += ')';
    console.log( keys, ' == ', val);
    mapkeys = keys;
    mapvalues = val;
    return obj;
}

console.log('Encode: ', html.encode('<input type="password" name="password" value=""/>') ); 
console.log('Decode: ', html.decode(html.encode('<input type="password" name="password" value=""/>')) );

O/P:
Encode:  &lt;input type=&quot;password&quot; name=&quot;password&quot; value=&quot;&quot;/&gt;
Decode:  <input type="password" name="password" value=""/>

이것은 Json 형식의 html 소스 코드를 iframe srcdoc 문자열에 추가하는 데 유용합니다.
Nime Cloud

여기에는 ®이 포함되어 있지 않으므로 OP에 도움이되지 않습니다. 또한이 JS는 다른 많은 솔루션, 심지어 이와 같은 짧은 매핑 만 사용하는 솔루션보다 훨씬 더 복잡합니다. swapJsonKeyValues는 부작용이 필요하므로 이름이 잘못되었습니다 (맵키 및 맵값 정의)
Rick

@mickmackusa 디버그 값으로 게시물을 업데이트했습니다. m입력 문자열의 특수 문자를 보유합니다.
Yash 2011

게시물에 오류가있는 경우. 따라서 게시물을 수정하고 의견을 제공하십시오.
Yash 2011

3
var htmlEntities = [
            {regex:/&/g,entity:'&amp;'},
            {regex:/>/g,entity:'&gt;'},
            {regex:/</g,entity:'&lt;'},
            {regex:/"/g,entity:'&quot;'},
            {regex:/á/g,entity:'&aacute;'},
            {regex:/é/g,entity:'&eacute;'},
            {regex:/í/g,entity:'&iacute;'},
            {regex:/ó/g,entity:'&oacute;'},
            {regex:/ú/g,entity:'&uacute;'}
        ];

total = <some string value>

for(v in htmlEntities){
    total = total.replace(htmlEntities[v].regex, htmlEntities[v].entity);
}

어레이 솔루션


3
이것이 위의 것보다 독특하고 더 나은 방법으로 문제를 해결하는 방법을 설명하십시오. 언뜻보기에이 솔루션은 한 번에 모두가 아닌 여러 패스로 문자열을 수정하기 때문에 더 느린 것처럼 보입니다. 그러나 나는 틀릴 수 있습니다. 어느 쪽이든 게시 한 내용을 설명과 함께 백업해야합니다.
Jack Giffin

대안으로 배열에서 직접 정규식을 사용할 수 있습니다 ... : D
Cesar De la Cruz

이것은 각 문자에 대해 하나의 정규식입니다 (v in ....). UTF-8을 모두 다루려면 정규식 65,000 개와 실행 줄 65,000 줄이됩니다.
HoldOffHunger

2
저는 3 개의 문자를 엔티티로 변환하는 데만 관심이 있으므로이 답변은 제 경우에 더 낫습니다. 여기에있는 것이 기쁩니다
Drew

2

이미 jQuery를 사용하고 있다면 html().

$('<div>').text('<script>alert("gotcha!")</script>').html()
// "&lt;script&gt;alert("gotcha!")&lt;/script&gt;"

메모리 내 텍스트 노드가 인스턴스화되고 여기 html()에서 호출됩니다.

추악하고 약간의 메모리를 낭비하고 he라이브러리 와 같은 것만 큼 철저한 지 모르겠지만 이미 jQuery를 사용하고 있다면 이것이 옵션 일 것입니다.

Felix Geisendörfer의 블로그 게시물에서 가져온 jQueryHTML 엔터티 인코딩


3
매번 노드를 인스턴스화하지 않으려면 노드를 저장 var converter=$("<div>");하고 나중에 다시 사용할 수 있습니다. html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM

1

때로는 모든 문자를 인코딩하고 싶을 때도 있습니다.이 함수는 regxp에서 "모든 것"을 대체합니다.

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


1
이모티콘을 절약 하려면 ^을 a .로 바꾸십시오 function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}..
Swiss Mister

1

Ourcodeworld에서 튜토리얼을 확인하십시오 Ourcodeworld-자바 스크립트로 HTML 엔티티 인코딩 및 디코딩

가장 중요한 것은 he 라이브러리 예제

he.encode('foo © bar ≠ baz ???? qux');
// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'

// Passing an `options` object to `encode`, to explicitly encode all symbols:
he.encode('foo © bar ≠ baz ???? qux', {
 'encodeEverything': true
});

he.decode('foo &copy; bar &ne; baz &#x1D306; qux');
// → 'foo © bar ≠ baz ???? qux'

이 라이브러리는 아마도 코딩을 더 쉽고 더 잘 관리 할 수있게 해줄 것입니다. 인기 있고 정기적으로 업데이트되며 HTML 사양을 따릅니다. package.json 에서 볼 수 있듯이 자체에는 종속성이 없습니다.


OP는 바닐라 JS를 요청하고 바닐라 JS는 element.innerText를 제공합니다. 도서관에 이점이 있다면 답변에 추가하십시오.
Rick

0

다음은 인코딩을 구현 한 방법입니다. 나는 위에 주어진 답변에서 영감을 얻었습니다.

function encodeHTML(str) {
  const code = {
      ' ' : '&nbsp;',
      '¢' : '&cent;',
      '£' : '&pound;',
      '¥' : '&yen;',
      '€' : '&euro;', 
      '©' : '&copy;',
      '®' : '&reg;',
      '<' : '&lt;', 
      '>' : '&gt;',  
      '"' : '&quot;', 
      '&' : '&amp;',
      '\'' : '&apos;'
  };
  return str.replace(/[\u00A0-\u9999<>\&''""]/gm, (i)=>code[i]);
}

// TEST
console.log(encodeHTML("Dolce & Gabbana"));
console.log(encodeHTML("Hamburgers < Pizza < Tacos"));
console.log(encodeHTML("Sixty > twelve"));
console.log(encodeHTML('Stuff in "quotation marks"'));
console.log(encodeHTML("Schindler's List"));
console.log(encodeHTML("<>"));


목록에없는 \ u00A0- \ u9999의 입력에 대해 중단
Rick

m앵커가없는 패턴에서 패턴 수정 자의 목적을 설명하십시오 .
mickmackusa 2010

0

HTML 엔터티인코딩 또는 디코딩 하는 쉬운 방법 중 하나
하나의 인수로 함수를 호출하기 만하면됩니다.

HTML 엔티티 디코딩

function decodeHTMLEntities(text) {
  var textArea = document.createElement('textarea');
  textArea.innerHTML = text;
  return textArea.value;
}

HTML 엔티티 디코딩 (JQuery)

function decodeHTMLEntities(text) {
  return $("<textarea/>").html(text).text();
}

HTML 엔티티 인코딩

function encodeHTMLEntities(text) {
  var textArea = document.createElement('textarea');
  textArea.innerText = text;
  return textArea.innerHTML;
}

HTML 엔티티 인코딩 (JQuery)

function encodeHTMLEntities(text) {
  return $("<textarea/>").text(text).html();
}

-1

charCodeAt()메서드를 사용하여 지정된 문자의 값이 127보다 큰지 확인하고를 사용하여 숫자 문자 참조로 변환 할 수 toString(16)있습니다.


4
매직 넘버 127와 이것이 작동하는 방법 / 왜 에 대해 조금 추가 할 수 있다면 좋을 것입니다;)
yckart

-1
replaceHtmlEntities(text) {
  var tagsToReplace = {
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
  };
  var newtext = text;
  for (var tag in tagsToReplace) {
    if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) {
      var regex = new RegExp(tag, 'g');
      newtext = newtext.replace(regex, tagsToReplace[tag]);
    }
  }
  return newtext;
}

-1

<!DOCTYPE html>
<html>
<style>
button {
backround: #ccc;
padding: 14px;
width: 400px;
font-size: 32px;
}
#demo {
font-size: 20px;
font-family: Arial;
font-weight: bold;
}
</style>
<body>

<p>Click the button to decode.</p>

<button onclick="entitycode()">Html Code</button>

<p id="demo"></p>


<script>
function entitycode() {
  var uri = "quotation  = ark __ &apos; = apostrophe  __ &amp; = ampersand __ &lt; = less-than __ &gt; = greater-than __ 	non- = reaking space __ &iexcl; = inverted exclamation mark __ &cent; = cent __ &pound; = pound __ &curren; = currency __ &yen; = yen __ &brvbar; = broken vertical bar __ &sect; = section __ &uml; = spacing diaeresis __ &copy; = copyright __ &ordf; = feminine ordinal indicator __ &laquo; = angle quotation mark (left) __ &not; = negation __ &shy; = soft hyphen __ &reg; = registered trademark __ &macr; = spacing macron __ &deg; = degree __ &plusmn; = plus-or-minus  __ &sup2; = superscript 2 __ &sup3; = superscript 3 __ &acute; = spacing acute __ &micro; = micro __ &para; = paragraph __ &middot; = middle dot __ &cedil; = spacing cedilla __ &sup1; = superscript 1 __ &ordm; = masculine ordinal indicator __ &raquo; = angle quotation mark (right) __ &frac14; = fraction 1/4 __ &frac12; = fraction 1/2 __ &frac34; = fraction 3/4 __ &iquest; = inverted question mark __ &times; = multiplication __ &divide; = division __ &Agrave; = capital a, grave accent __ &Aacute; = capital a, acute accent __ &Acirc; = capital a, circumflex accent __ &Atilde; = capital a, tilde __ &Auml; = capital a, umlaut mark __ &Aring; = capital a, ring __ &AElig; = capital ae __ &Ccedil; = capital c, cedilla __ &Egrave; = capital e, grave accent __ &Eacute; = capital e, acute accent __ &Ecirc; = capital e, circumflex accent __ &Euml; = capital e, umlaut mark __ &Igrave; = capital i, grave accent __ &Iacute; = capital i, acute accent __ &Icirc; = capital i, circumflex accent __ &Iuml; = capital i, umlaut mark __ &ETH; = capital eth, Icelandic __ &Ntilde; = capital n, tilde __ &Ograve; = capital o, grave accent __ &Oacute; = capital o, acute accent __ &Ocirc; = capital o, circumflex accent __ &Otilde; = capital o, tilde __ &Ouml; = capital o, umlaut mark __ &Oslash; = capital o, slash __ &Ugrave; = capital u, grave accent __ &Uacute; = capital u, acute accent __ &Ucirc; = capital u, circumflex accent __ &Uuml; = capital u, umlaut mark __ &Yacute; = capital y, acute accent __ &THORN; = capital THORN, Icelandic __ &szlig; = small sharp s, German __ &agrave; = small a, grave accent __ &aacute; = small a, acute accent __ &acirc; = small a, circumflex accent __ &atilde; = small a, tilde __ &auml; = small a, umlaut mark __ &aring; = small a, ring __ &aelig; = small ae __ &ccedil; = small c, cedilla __ &egrave; = small e, grave accent __ &eacute; = small e, acute accent __ &ecirc; = small e, circumflex accent __ &euml; = small e, umlaut mark __ &igrave; = small i, grave accent __ &iacute; = small i, acute accent __ &icirc; = small i, circumflex accent __ &iuml; = small i, umlaut mark __ &eth; = small eth, Icelandic __ &ntilde; = small n, tilde __ &ograve; = small o, grave accent __ &oacute; = small o, acute accent __ &ocirc; = small o, circumflex accent __ &otilde; = small o, tilde __ &ouml; = small o, umlaut mark __ &oslash; = small o, slash __ &ugrave; = small u, grave accent __ &uacute; = small u, acute accent __ &ucirc; = small u, circumflex accent __ &uuml; = small u, umlaut mark __ &yacute; = small y, acute accent __ &thorn; = small thorn, Icelandic __ &yuml; = small y, umlaut mark";
  var enc = encodeURI(uri);
  var dec = decodeURI(enc);
  var res = dec;
  document.getElementById("demo").innerHTML = res;
}
</script>

</body>
</html>


이것은 질문에 답하는 것처럼 보이지 않으며 코드 전용 답변입니다. 코드가 수행하는 작업과 질문과의 관계에 대한 설명을 제공하십시오.
Rick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.