2012-06-12 38 views
15

Làm cách nào để xóa mã biểu tượng cảm xúc bằng JavaScript? Tôi nghĩ rằng tôi đã chăm sóc nó bằng cách sử dụng mã dưới đây, nhưng tôi vẫn có các ký tự như thế nào.Làm cách nào để xóa mã biểu tượng cảm xúc bằng javascript?

function removeInvalidChars() { 
    return this.replace(/[\uE000-\uF8FF]/g, ''); 
} 
+1

[Có nhiều ký tự trong phạm vi đó] (http://inamidst.com/stuff/unidata/) - có lẽ bạn nên loại bỏ các điểm mã riêng lẻ mà bạn không thích? – sarnold

+2

Tôi nghĩ rằng http://stackoverflow.com/questions/3744721/javascript-strings-outside-of-the-bmp trả lời câu hỏi của bạn. –

+1

Dưới đây là một bài viết hay cũng đề cập đến các phạm vi đó: http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript – acme

Trả lời

33

Phạm vi bạn đã chọn là Khu vực sử dụng cá nhân, chứa ký tự không chuẩn. Các mạng được sử dụng để mã hóa biểu tượng cảm xúc dưới dạng các giá trị khác nhau, không nhất quán trong phạm vi này.

Gần đây hơn, biểu tượng cảm xúc đã được đưa ra tiêu chuẩn 'thống nhất' codepoints. Rất nhiều trong số này nằm ngoài Mặt phẳng đa ngôn ngữ cơ bản, trong khối U + 1F300 – U + 1F5FF, bao gồm cả ví dụ U + 1F534 Vòng tròn lớn màu đỏ của bạn.

Bạn có thể phát hiện các ký tự này với [\U0001F300-\U0001F5FF] trong công cụ regex hỗ trợ các ký tự không phải BMP, nhưng JavaScript RegExp không phải là một con thú như vậy. Thật không may là mô hình chuỗi JS được dựa trên đơn vị UTF-16 mã, do đó bạn sẽ phải làm việc với UTF-16 người đại diện trong một regexp:

return this.replace(/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g, '') 

Tuy nhiên, lưu ý rằng có những nhân vật khác trong đa ngôn ngữ cơ bản Máy bay được sử dụng làm biểu tượng cảm xúc bằng điện thoại nhưng có biểu tượng cảm xúc từ trước. Ví dụ: U + 2665 là nhân vật Heart Suit truyền thống ♥, nhưng nó được hiển thị dưới dạng biểu tượng cảm xúc trên một số thiết bị. Đó là vào bạn cho dù bạn đối xử với điều này như biểu tượng cảm xúc và cố gắng loại bỏ nó. Xem this list để biết thêm ví dụ.

+0

Ngoài ra, cần lưu ý rằng nếu một chuỗi chèn sau đó vào cơ sở dữ liệu, thay thế bằng chuỗi rỗng có thể phơi bày vấn đề bảo mật. thay vào đó thay thế bằng ký tự thay thế U + FFFD, hãy xem: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – jony89

5

@ giải pháp của bobince không hoạt động đối với tôi. Một trong hai biểu tượng cảm xúc ở đó hoặc chúng được hoán đổi bởi một Biểu tượng cảm xúc khác.

Giải pháp này đã làm các trick cho tôi:

var ranges = [ 
 
    '\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF 
 
    '\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F 
 
    '\ud83d[\ude80-\udeff]' // U+1F680 to U+1F6FF 
 
]; 
 

 

 
$('#mybtn').on('click', function() { 
 
    removeInvalidChars(); 
 
}) 
 

 
function removeInvalidChars() { 
 
    var str = $('#myinput').val(); 
 

 
    str = str.replace(new RegExp(ranges.join('|'), 'g'), ''); 
 
    $("#myinput").val(str); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="myinput"/> 
 
<input type="submit" id="mybtn" value="clear"/>

Source

+1

Chính xác những gì tôi cần. –

+1

giải pháp này cũng không hoạt động đối với nhiều ký tự như – Meysam

2

Tôi biết bài này là một chút cũ, nhưng tôi stumbled trên vấn đề này rất tại nơi làm việc và một đồng nghiệp đã đưa ra một ý tưởng thú vị. Về cơ bản thay vì tước nhân vật biểu tượng cảm xúc chỉ cho phép ký tự hợp lệ trong Tư vấn bảng này ASCII:.

http://www.asciitable.com/

Một chức năng như thế này chỉ có thể giữ nhân vật hợp pháp (phạm vi bản thân phụ thuộc vào những gì bạn đang sau)

function (input) { 
      var result = ''; 
      if (input.length == 0) 
       return input; 
      for (var indexOfInput = 0, lengthOfInput = input.length; indexOfInput < lengthOfInput; indexOfInput++) { 
       var charAtSpecificIndex = input[indexOfInput].charCodeAt(0); 
       if ((32 <= charAtSpecificIndex) && (charAtSpecificIndex <= 126)) { 
        result += input[indexOfInput]; 
       } 
      } 
      return result; 
     }; 

Điều này sẽ lưu giữ tất cả các số, chữ cái và ký tự đặc biệt của bảng chữ cái trong trường hợp bạn muốn giữ bảng chữ cái tiếng Anh + số + ký tự đặc biệt. Hy vọng nó sẽ giúp ai đó :)

1

Không có câu trả lời nào ở đây làm việc cho tất cả các ký tự unicode tôi đã thử nghiệm (cụ thể các ký tự trong phạm vi linh tinh như ⛽ hoặc ☯️).

Dưới đây là một trong đó làm việc cho tôi, (nặng) lấy cảm hứng từ this SO PHP answer:

function _removeEmojis(str) { 
    return str.replace(/([#0-9]\u20E3)|[\xA9\xAE\u203C\u2047-\u2049\u2122\u2139\u3030\u303D\u3297\u3299][\uFE00-\uFEFF]?|[\u2190-\u21FF][\uFE00-\uFEFF]?|[\u2300-\u23FF][\uFE00-\uFEFF]?|[\u2460-\u24FF][\uFE00-\uFEFF]?|[\u25A0-\u25FF][\uFE00-\uFEFF]?|[\u2600-\u27BF][\uFE00-\uFEFF]?|[\u2900-\u297F][\uFE00-\uFEFF]?|[\u2B00-\u2BF0][\uFE00-\uFEFF]?|(?:\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDEFF])[\uFE00-\uFEFF]?/g, ''); 
} 

(trường hợp sử dụng của tôi là sắp xếp trong một mạng lưới dữ liệu mà biểu tượng cảm xúc có thể đến đầu tiên trong một chuỗi nhưng người dùng muốn các văn bản đã ra lệnh bởi những từ thực tế.)

+0

cảm ơn bạn vì điều này.Một điều tôi nhận thấy rằng nó không bắt được tất cả các biểu tượng cảm xúc. Tôi tìm thấy một chuỗi regex nhưng nó đang làm một cái gì đó sôi nổi như xóa ký tự trước và thêm ký tự. Tôi không thể tìm ra sự khác biệt. Đây là sự so sánh giữa JSbin giữa bạn và cái kia: [link] (http://jsbin.com/notewug/1/edit?js,console) –

4

tôi đã tìm thấy nhiều gợi ý xung quanh nhưng regex mà đã giải quyết vấn đề của tôi là:

/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g 

Một ví dụ ngắn

function removeEmojis (string) { 
    var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g; 
    return string.replace(regex, ''); 
} 

Hy vọng nó có thể giúp bạn

+1

Câu trả lời tuyệt vời cho tôi. Tuy nhiên một sai lầm trong regex gây ra điều này cũng phải phù hợp với dấu ngoặc vuông ([). Có vẻ như chỉ là một lỗi khi sao chép và dán mã, nhưng Lucas hãy sửa chữa. Sửa lỗi regex tại đây: https://pastebin.com/0VZZKfWf –

+0

Cảm ơn bạn đã gợi ý, @MarcGuiselin –

8

Đối với tôi không ai trong số các câu trả lời hoàn toàn loại bỏ tất cả các biểu tượng cảm xúc vì vậy tôi đã phải làm một số công việc bản thân mình và đây là những gì tôi đã nhận:

text.replace(/([\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2694-\u2697]|\uD83E[\uDD10-\uDD5D])/g, '') 

Ngoài ra, cần lưu ý rằng nếu người ta chèn chuỗi sau vào cơ sở dữ liệu, thay thế bằng chuỗi trống có thể phơi bày vấn đề bảo mật. thay vì thay thế với nhân vật thay thế U + FFFD, xem: http://www.unicode.org/reports/tr36/#Deletion_of_Noncharacters

Edit: Tôi đã thay đổi regex để incldue vài biểu tượng cảm xúc mới ..

+1

Đã thử nhiều giải pháp, nhưng điều này là một thành công lớn! Một lưu ý cho bất kỳ ai làm việc với API Twitter - điều này đã làm việc cho tôi! –

1

sandre89's answer là tốt nhưng không phải là hoàn hảo. Tôi đã dành thời gian cho chủ đề này và có một giải pháp làm việc.

var ranges = [ 
 
    '[\u00A0-\u269f]', 
 
    '[\u26A0-\u329f]', 
 
    // The following characters could not be minified correctly 
 
    // if specifed with the ES6 syntax \u{1F400} 
 
    '[-]' 
 
    //'[\u{1F004}-\u{1F9C0}]' 
 
]; 
 

 

 
$('#mybtn').on('click', function() { 
 
    removeInvalidChars(); 
 
}); 
 

 
function removeInvalidChars() { 
 
    var str = $('#myinput').val(); 
 
    str = str.replace(new RegExp(ranges.join('|'), 'ug'), ''); 
 
    $("#myinput").val(str); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="myinput" /> 
 
<input type="submit" id="mybtn" value="clear" />

Đây là my CodePen

Có một số điểm cần lưu ý, mặc dù.

  1. ký tự Unicode từ U+1F000 lên cần một ký hiệu đặc biệt, vì vậy bạn có thể sử dụng cách sandre89, hoặc lựa chọn các \u{1F000} ES6 ký hiệu, mà có thể hoặc không thể làm việc với minificator của bạn. Tôi đã thành công dán biểu tượng cảm xúc trực tiếp trong tập lệnh được mã hóa UTF-8.

  2. Đừng quên cờ u trong regex hoặc công cụ Javascript của bạn có thể bị lỗi.

Hãy chú ý rằng mọi thứ có thể không hoạt động do mã hóa tệp, bộ ký tự hoặc bộ thu nhỏ. Trong trường hợp của tôi không có gì làm việc cho đến khi tôi lấy kịch bản ra một tập tin .isml (Demandware) và dán nó vào một tập tin .js.

Bạn có thể đạt được một số thông tin chi tiết bằng cách tham khảo Wikipedia Emoji pageHow many bytes does one Unicode character take? và bằng cách sửa đổi số này Online Unicode converter, như tôi đã làm.

Các vấn đề liên quan