Mã hóa các thực thể html trong javascript


100

Tôi đang làm việc trong CMS cho phép người dùng nhập nội dung. Vấn đề là khi họ thêm các biểu tượng ®, nó có thể không hiển thị tốt trong tất cả các trình duyệt. Tôi muốn thiết lập một danh sách các ký hiệu phải được tìm kiếm và sau đó được chuyển đổi sang thực thể html tương ứng. Ví dụ

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

Sau khi chuyển đổi, nó cần được bao bọc trong một <sup> thẻ, dẫn đến điều này:

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

Bởi vì kích thước phông chữ và kiểu đệm cụ thể là cần thiết:

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

JavaScript có giống như thế này không?

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([?]);
}

Ở đâu "[?]" Có nghĩa là có điều gì đó mà tôi không chắc chắn.

Chi tiết bổ sung:

  • Tôi muốn làm điều này với JavaScript thuần túy, không phải thứ yêu cầu thư viện như jQuery, cảm ơn.
  • Backend là Ruby
  • Sử dụng RefineryCMS được xây dựng bằng Ruby on Rails

Chương trình phụ trợ của bạn là gì? Nếu đó là php, có các chức năng để giải quyết việc này cho bạn và tôi chắc chắn rằng các ngôn ngữ khác cũng có chúng. Ngoài ra, Google: developwithstyle.com/articles/2010/06/29/...
Chris Baker

5
Giải pháp tốt hơn có thể là chấp nhận và xuất ra văn bản được mã hóa UTF-8. Mọi trình duyệt được sử dụng ngày nay đều hỗ trợ UTF-8. Về phía HTML, bạn muốn thêm accept-charset="UTF-8"vào <form>thẻ của mình . Trên máy chủ, bạn muốn đảm bảo đầu ra của mình được mã hóa UTF-8 và máy chủ web của bạn cho trình duyệt biết rằng đó là (thông qua Content-Typetiêu đề). Xem Rentzsch.tumblr.com/post/9133498042/… Nếu bạn làm tất cả những điều đó và trình duyệt không hiển thị ký tự chính xác, thì việc thay thế ký tự bằng một thực thể sẽ không tạo ra sự khác biệt nào.
Paul D. Waite

@Chris làm việc trong CMS được xây dựng bằng Ruby on Rails.
JGallardo

Sai khi thay đổi một ký tự thành tham chiếu thực thể HTML trong JavaScript phía máy khách, vì JavaScript phía máy khách hoạt động trên DOM, nơi các thực thể không tồn tại. Việc bao bọc “®” thành supcác phần tử có xu hướng gây ra nhiều vấn đề hơn nó có thể giải quyết, vì trong nhiều phông chữ, “®” nhỏ và ở vị trí chỉ số dưới, vì vậy bạn sẽ giảm nó xuống mức khó nhận ra.
Jukka K. Korpela

@ JukkaK.Korpela, vì vậy tôi cần phải giải quyết rằng một số thực thể html sẽ không hiển thị đúng cách, bạn sẽ giải quyết nó như thế nào? Và kết hợp <sup>không phải là một vấn đề vì tôi đã thử nghiệm các phông chữ cụ thể được sử dụng cho các bài đăng trên blog, nhưng đó là một điểm tốt để xem xét.
JGallardo

Câu trả lời:


176

Bạn có thể sử dụng regex để thay thế bất kỳ ký tự nào trong một dải unicode nhất định bằng thực thể html tương đương của nó. Mã sẽ trông giống như sau:

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

Mã này sẽ thay thế tất cả các nhân vật trong phạm vi nhất định (unicode 00A0 - 9999, cũng như dấu và, hơn & ít hơn) với các khoản tương đương thực thể html của họ, mà chỉ đơn giản là &#nnn;nơi nnnđược giá trị unicode chúng tôi nhận được từcharCodeAt .

Xem nó hoạt động tại đây: http://jsfiddle.net/E3EqX/13/ (ví dụ này sử dụng jQuery cho các bộ chọn phần tử được sử dụng trong ví dụ. Bản thân mã cơ sở ở trên không sử dụng jQuery)

Thực hiện các chuyển đổi này không giải quyết được tất cả các vấn đề - hãy đảm bảo rằng bạn đang sử dụng mã hóa ký tự UTF8, đảm bảo rằng cơ sở dữ liệu của bạn đang lưu trữ các chuỗi trong UTF8. Bạn vẫn có thể thấy các trường hợp ký tự không hiển thị chính xác, tùy thuộc vào cấu hình phông chữ hệ thống và các vấn đề khác ngoài tầm kiểm soát của bạn.

Tài liệu


Cảm ơn bạn rất nhiều vì jsfiddle. Vì vậy, để thực hiện điều này. Tôi chỉ có thể thêm cái này vào .jstệp của mình và thêm những thứ khác để kết thúc bằng một <sup>?
JGallardo

2
@JGallardo Tôi đã viết lại ví dụ một chút để nó thêm supthẻ (hoặc bất kỳ thẻ nào khác) và nó được chứa trong một hàm: jsfiddle.net/E3EqX/4 . Để sử dụng, bạn cần sao chép hàm "encodeAndWrap" vào dự án của mình.
Chris Baker

1
@Chris cảm ơn vì đoạn mã gọn gàng, mặc dù đoạn mã này có một lỗi: "[\ u00A0- \ u99999]" không làm những gì bạn mong đợi, mà đúng hơn là "[\ u00A0- \ u9999] | 9 " - I E. ký tự "9" cũng sẽ được thay thế bằng một thực thể HTML. Bạn cũng có thể thử điều đó trong fiddle. Tôi sẽ đề xuất một bản sửa lỗi cho câu trả lời.
SB

@SB Cảm ơn vì ghi chú đó, tôi thậm chí còn phải bỏ phiếu chấp thuận cuối cùng :)
Chris Baker

1
Mặc dù tôi đồng ý rằng câu trả lời của @mathias Bynens là đầy đủ hơn, nhưng giải pháp của anh ấy là 84KB và điều đó khiến tôi tiếp tục tìm kiếm một giải pháp thay thế. Điều này có vẻ ổn, tuy nhiên người ta cũng có thể bao gồm các mã charCodes <65 và giữa> 90 && <97?
Florian Mertens

62

Câu trả lời hiện được chấp nhận có một số vấn đề. Bài đăng này giải thích chúng và cung cấp một giải pháp mạnh mẽ hơn. Giải pháp được đề xuất trong câu trả lời đó trước đây có:

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

Các i lá cờ là không cần thiết vì không có biểu tượng Unicode trong khoảng từ U + 00A0 đến U + 9999 có một chữ hoa / chữ thường biến thể đó nằm ngoài phạm vi đó tương tự.

Các mlá cờ là không cần thiết vì ^hay$ không được sử dụng trong các biểu thức chính quy.

Tại sao phạm vi U + 00A0 đến U + 9999? Nó có vẻ tùy tiện.

Dù sao, đối với một giải pháp mã hóa chính xác tất cả ngoại trừ các ký hiệu ASCII an toàn và có thể in được trong đầu vào (bao gồm cả ký hiệu astral!) Và triển khai tất cả các tham chiếu ký tự được đặt tên (không chỉ những ký tự trong HTML4), hãy sử dụng thư viện he (tuyên bố từ chối trách nhiệm: Thư viện này là của tôi ). Từ README của nó:

he (đối với “các thực thể HTML”) là một bộ mã hóa / giải mã thực thể HTML mạnh mẽ được viết bằng JavaScript. Nó hỗ trợ tất cả các tham chiếu ký tự được đặt tên được tiêu chuẩn hóa theo HTML , xử lý các ký hiệuký tự không rõ ràng và các trường hợp biên khác giống như trình duyệt , có một bộ thử nghiệm mở rộng và - trái với nhiều giải pháp JavaScript khác - anh ấy xử lý các ký hiệu Unicode thuần túy. Một bản demo trực tuyến có sẵn.

Cũng xem câu trả lời Stack Overflow có liên quan này .


12
Ngoài ra, thư viện HE là ... 84KB! Autch ... Hãy thử tải xuống phần mềm đó trên điện thoại di động qua kết nối thấp hơn. Một thỏa hiệp phải được thực hiện ở đâu đó ..
Florian Mertens

1
@FlorianMertens Sau khi thu nhỏ + gzip , anh ấy còn ~ 24 KB. Điều đó vẫn còn lớn, nhưng vào cuối ngày nếu bạn muốn giải mã các thực thể HTML một cách chính xác, bạn sẽ cần tất cả dữ liệu về chúng - không có cách nào khác. Nếu bạn có thể tìm ra cách để thu nhỏ thư viện mà không ảnh hưởng đến hiệu suất, vui lòng gửi yêu cầu kéo.
Mathias Bynens

2
@MathiasBynens, không có nghi ngờ thư viện của bạn là tốt, nhưng bạn có thể sử dụng bình ô để đánh dấu vấn đề trong các câu trả lời được chấp nhận và xin vui lòng gửi câu trả lời cải thiện của bạn trong khối mã
diEcho

3
@drzaus Hình ảnh có thể không có dung lượng lớn vì chúng lưu trữ nhiều dữ liệu và dữ liệu nén ít hơn sẽ giải mã nhanh hơn. Tuy nhiên mã chương trình thì khác, thường thì toàn bộ thư viện được thêm vào và ít sử dụng nó. Mã của các thư viện đôi khi chứa nhiều dòng hơn mã của riêng bạn! Thêm vào đó, một số người sẽ bận tâm đến việc tìm / gỡ lỗi các vấn đề lib và gửi báo cáo lỗi (hoặc thậm chí cập nhật lib), do đó, rò rỉ bộ nhớ hoặc các vấn đề khác có thể tồn tại trong phần mềm có nhiều lib với mã không được kiểm tra. Nếu ai đó chỉ muốn mã hóa / thoát các ký tự không an toàn trong html, thì chỉ cần một vài dòng, không phải 80kb.
bryc

1
@MarcoKlein Vâng, tôi giải thích điều đó trong bài đăng của mình. Đó thực sự là một vấn đề mà đoạn mã lỗi gặp phải. Giải pháp mà tôi chỉ ra không có vấn đề đó. (xem “bao gồm các biểu tượng trung gian!”)
Mathias Bynens,

29

Tôi đã gặp vấn đề tương tự và đã tạo 2 hàm để tạo thực thể và dịch chúng trở lại ký tự bình thường. Các phương pháp sau đây dịch bất kỳ chuỗi nào sang các thực thể HTML và quay lại nguyên mẫu chuỗi

/**
 * 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]);
    })
};

Sau đó, bạn có thể sử dụng nó như sau:

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

Đầu ra trong bảng điều khiển:

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 

Giải pháp này cũng hoạt động trên tvOS nên có thể giải quyết tốt các vấn đề về mã hóa trong mọi trường hợp.
loretoparisi

4
Đó không phải là một chút cực đoan? Bạn đang chuyển đổi mọi thứ thành các thực thể HTML, ngay cả các ký tự "an toàn" như "abc", "123" ... thậm chí cả khoảng trắng
AJPerez

1
Đây là một câu trả lời tồi. Hơn 50% tài liệu trên web chủ yếu chứa latin1 với một số utf-8. Việc mã hóa các ký tự an toàn của bạn sẽ tăng kích thước của nó lên 500% đến 600% mà không có bất kỳ lợi thế nào.
HoldOffHunger

Vui lòng giải thích mục đích của công cụ msửa đổi mẫu trong một mẫu không có neo. Vậy ý bạn là sử dụng scho mẫu có chứa dấu chấm?
mickmackusa

18

Không có bất kỳ thư viện nào, nếu bạn không cần hỗ trợ IE <9, bạn có thể tạo một phần tử html và đặt nội dung của nó bằng Node.textContent :

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

Đây là một ví dụ: https://jsfiddle.net/1erdhehv/


2
Tại sao không sử dụng innerText thay vì textContent?
Rick

@Rick, cung cấp cho tài liệu MDN cho textContent được liên kết trong câu trả lời. Trích dẫn nó "textContent và HTMLElement.innerText rất dễ bị nhầm lẫn, nhưng hai thuộc tính này khác nhau theo những cách quan trọng ."
Adarsha

17

Bạn có thể sử dụng cái này.

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
Việc thêm một tập hợp con ngẫu nhiên của các ký tự có thể mã hóa theo cách thủ công có thể gây ra rắc rối cho chính bạn và đồng nghiệp của bạn. Nên có một cơ quan duy nhất cho các ký tự cần được mã hóa, có thể là trình duyệt hoặc không thể có một thư viện cụ thể có khả năng toàn diện và duy trì.
user234461

Điểm tuyệt vời, @ user234461. Nếu bất cứ ai tìm thấy quyền hạn duy nhất đó, những người thích tìm hiểu (như tôi) sẽ rất muốn biết!
idungotnosn

7

Nếu bạn muốn tránh mã hóa các thực thể html nhiều lần

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

# Thí dụ

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>

Điều này chỉ hữu ích nếu bạn có một văn bản thoát một phần hỗn hợp để bắt đầu và nó gây ra lỗi vì nó không thể mã hóa đúng tất cả các chuỗi: <#>sẽ xuất hiện dưới dạng<#&#62;
Rick

@Rick Cảm ơn đã thông báo cho tôi về điều đó, tôi đã cập nhật câu trả lời của mình để làm cho nó tốt hơn.
StefansArya

4

Các ký tự đặc biệt trong HTML & nó ESCAPE CODES

Các ký tự dành riêng phải được thoát bằng HTML: Chúng ta có thể sử dụng lối thoát ký tự để đại diện cho bất kỳ ký tự Unicode nào [Ví dụ: & - U + 00026] trong HTML, XHTML hoặc XML chỉ sử dụng các ký tự ASCII. Tham chiếu ký tự số [ Ví dụ: dấu và (&) - &#38;] & Tham chiếu ký tự được đặt tên [Ví dụ: &amp;] là các loại character escape used in markup.


Thực thể được xác định trước

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

Để hiển thị Thẻ HTML ở dạng bình thường trong trang web chúng ta sử dụng <pre>, <code>các thẻ hoặc chúng ta có thể thoát khỏi chúng. Thoát khỏi chuỗi bằng cách thay thế bằng bất kỳ lần xuất hiện nào của "&"ký tự bằng chuỗi "&amp;"và bất kỳ lần xuất hiện nào của ">"ký tự bằng chuỗi "&gt;". Ví dụ: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=""/>

Điều này rất tốt để thêm mã nguồn html ở định dạng Json vào chuỗi iframe srcdoc.
Nime Cloud

Điều này không bao gồm ®, vì vậy nó sẽ không giúp OP. Ngoài ra, JS này phức tạp hơn rất nhiều so với nhiều giải pháp khác, ngay cả những giải pháp chỉ sử dụng ánh xạ ngắn như thế này. swapJsonKeyValues ​​được đặt tên kém vì nó có các tác dụng phụ yêu cầu (xác định mapkey và giá trị bản đồ)
Rick

@mickmackusa Tôi đã cập nhật bài đăng với các giá trị gỡ lỗi. mgiữ các ký tự đặc biệt của một Chuỗi đầu vào.
Yash

Nếu có bất kỳ sai sót trong bài viết. Vì vậy, hãy cố gắng sửa bài viết và cung cấp các ý kiến.
Yash

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

Một giải pháp mảng


3
Vui lòng giải thích cách điều này giải quyết vấn đề theo một cách tốt hơn duy nhất ở trên. Thoạt nhìn, có vẻ như giải pháp này chậm hơn vì nó sửa đổi chuỗi theo nhiều lần thay vì tất cả cùng một lúc. Tuy nhiên, tôi có thể không chính xác. Dù bằng cách nào, bạn cũng phải sao lưu bạn đăng kèm theo lời giải thích.
Jack Giffin

Một sự thay thế của nó, bạn có thể sử dụng regex trực tiếp từ mảng ...: D
Cesar De la Cruz

Đây là một regex cho mỗi ký tự (cho v in ....). Nếu bạn muốn bao gồm tất cả UTF-8, đây sẽ là 65.000 regex và 65.000 dòng thực thi.
HoldOffHunger

2
Tôi chỉ quan tâm đến việc chuyển đổi ba ký tự thành thực thể nên câu trả lời này tốt hơn trong trường hợp của tôi và tôi rất vui vì nó đã có ở đây
Drew

2

Nếu bạn đã sử dụng jQuery, hãy thử html().

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

Một nút văn bản trong bộ nhớ được khởi tạo và html()được gọi trên đó.

Nó xấu xí, lãng phí một chút bộ nhớ và tôi không biết liệu nó có kỹ lưỡng như hethư viện hay không nhưng nếu bạn đã sử dụng jQuery, có lẽ đây là một lựa chọn cho bạn.

Lấy từ bài đăng trên blog Mã hóa các thực thể HTML bằng jQuery của Felix Geisendörfer.


3
Để tránh instantiating một nút mỗi thời gian, bạn có thể lưu các nút: var converter=$("<div>");và sau đó tái sử dụng nó: html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM

1

Đôi khi bạn chỉ muốn mã hóa mọi ký tự ... Hàm này thay thế "mọi thứ nhưng không có gì" trong regxp.

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


1
Thay thế ^bởi một .để biểu tượng cảm xúc Conserve: function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}.
Swiss Mister

1

Xem hướng dẫn từ Ourcodeworld Ourcodeworld - mã hóa và giải mã các thực thể html bằng javascript

Quan trọng nhất, ví dụ thư viện 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'

Thư viện này có thể sẽ giúp việc viết mã của bạn dễ dàng hơn và được quản lý tốt hơn. Nó phổ biến, được cập nhật thường xuyên và tuân theo thông số kỹ thuật HTML. Bản thân nó không có phụ thuộc, như có thể thấy trong package.json


OP đã yêu cầu vanilla JS và vanilla JS cung cấp element.innerText. Nếu có lợi thế cho thư viện, vui lòng thêm nó vào câu trả lời của bạn.
Rick

0

Đây là cách tôi triển khai mã hóa. Tôi lấy cảm hứng từ những câu trả lời được đưa ra ở trên.

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("<>"));


ngắt cho bất kỳ đầu vào nào trong \ u00A0- \ u9999 không có trong danh sách của bạn
Rick

Vui lòng giải thích mục đích của công cụ msửa đổi mẫu trong một mẫu không có neo.
mickmackusa

-1

Bạn có thể sử dụng charCodeAt()phương pháp để kiểm tra xem ký tự được chỉ định có giá trị cao hơn 127 hay không và chuyển đổi nó thành tham chiếu ký tự số bằng cách sử dụng toString(16).


4
Would tốt đẹp nếu bạn có thể thêm một chút thông tin về con số kỳ diệu 127và làm thế nào / tại sao công việc này;)
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>


Điều này dường như không trả lời câu hỏi và nó là câu trả lời chỉ có mã. Vui lòng cung cấp mô tả về mã đang hoạt động và nó liên quan như thế nào đến câu hỏi.
Rick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.