2012-06-12 15 views
15

Come rimuovo il codice emoji utilizzando JavaScript? Pensavo di essermene preso cura usando il codice qui sotto, ma ho ancora personaggi come.Come rimuovere il codice emoji usando javascript?

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

[Ci sono molti personaggi in quell'intervallo] (http://inamidst.com/stuff/unidata/) - forse dovresti invece rimuovere i singoli codepoint che non ti piacciono? – sarnold

+2

Penso che http://stackoverflow.com/questions/3744721/javascript-strings-outside-of-the-bmp risponda alla tua domanda. –

+1

Ecco un buon articolo che tratta anche di questi intervalli: http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript – acme

risposta

33

L'intervallo è stato selezionato è l'uso Area Privata, contenenti caratteri non standard. Vettori utilizzati per codificare le emoji come valori diversi e incoerenti all'interno di questo intervallo.

Più recentemente, all'emoji sono stati assegnati codepoint standard "unificati". Molti di questi sono al di fuori del Piano Multilingue di Base, nel blocco U + 1F300-U + 1F5FF, incluso l'esempio U + 1F534 Large Red Circle.

È possibile rilevare questi caratteri con [\U0001F300-\U0001F5FF] in un motore regex che supportava caratteri non BMP, ma JavaScript RegExp non è una tale bestia. Purtroppo il modello di stringa di JS è basata su unità UTF-16 di codice, in modo che ci si deve lavorare con le UTF-16 surrogati in un espressione regolare:

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

Tuttavia, notare che ci sono altri personaggi del multilingue di base Aereo che viene usato come emoji dai telefoni ma che predica a lungo le emoji. Ad esempio, U + 2665 è il tradizionale personaggio di Heart Suit ♥, ma è possibile renderlo come un emoji grafico su alcuni dispositivi. Spetta a te se lo tratti come emoji e tenti di rimuoverlo. Vedi this list per ulteriori esempi.

+0

Inoltre, dovrebbe tenere conto che se si inserisce la stringa successivamente nel database, la sostituzione con una stringa vuota potrebbe esporre problemi di sicurezza. sostituisci invece con il carattere di sostituzione U + FFFD, vedi: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – jony89

5

@ la soluzione di bobince non ha funzionato per me. O gli Emoji sono rimasti lì o sono stati scambiati da un Emoji diverso.

Questa soluzione ha fatto il trucco per me:

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

Esattamente quello di cui avevo bisogno. –

+1

questa soluzione non funziona anche per molti personaggi come – Meysam

2

So che questo post è un po 'vecchio, ma mi sono imbattuto in questo stesso problema sul lavoro e un collega ha avuto un'idea interessante. In sostanza, invece di strippaggio carattere emoji consentire solo caratteri validi in Consulenza questa tabella ASCII:.

http://www.asciitable.com/

Una funzione di questo tipo poteva tenere solo caratteri di legge (il campo in sé dipende da quello che cercate)

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

Questo dovrebbe conservare tutti i numeri, lettere e caratteri speciali dell'alfabeto per una situazione in cui si desidera conservare l'alfabeto inglese + numero + caratteri speciali. Spero che aiuti qualcuno :)

1

Nessuna delle risposte qui ha funzionato per tutti i caratteri unicode che ho testato (in particolare i caratteri nell'intervallo misto come ⛽ o ☯️).

Ecco uno che ha lavorato per me, (pesantemente) ispirato da 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, ''); 
} 

(mio caso d'uso è l'ordinamento in una griglia di dati in cui emoji può venire prima di una serie, ma gli utenti vogliono il testo ordinato dalle parole reali.)

+0

grazie per questo.Una cosa ho notato che non stava prendendo tutti gli emoji. Ho trovato un'altra stringa regex ma sta facendo qualcosa di funky come cancellare il carattere prima e aggiungere caratteri. Non riesco a capire la differenza. Ecco un confronto in JSbin tra il tuo e l'altro: [link] (http://jsbin.com/notewug/1/edit?js,console) –

4

ho trovato molti suggerimenti di tutto, ma l'espressione regolare che hanno risolto il mio problema è:

/(?:[\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 

Un breve esempio

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

spero che possa aiutare a

+1

Ottima risposta per me. Tuttavia, un errore nella regex fa sì che questo corrisponda anche alle parentesi quadre ([). Sembra solo un errore nel copiare e incollare il codice, ma Lucas per favore aggiusta. Correzione delle espressioni regolari qui: https://pastebin.com/0VZZKfWf –

+0

Grazie per il tuo suggerimento, @MarcGuiselin –

8

Per me nessuna delle risposte ha rimosso completamente tutti gli emoji quindi ho dovuto fare un po 'di lavoro e questo è quello che ho ottenuto:

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

Inoltre, è necessario tenere presente che se si inserisce la stringa in un secondo momento nel database, la sostituzione con una stringa vuota potrebbe esporre problemi di sicurezza. invece sostituire con il carattere di sostituzione U + FFFD, vedi: http://www.unicode.org/reports/tr36/#Deletion_of_Noncharacters

Edit: ho cambiato l'espressione regolare per incldue alcuni nuovi Emojis ..

+1

Provato molte soluzioni, ma questo è stato un grande successo! Una nota per chiunque lavori con l'API di Twitter - questo ha funzionato per me! –

1

sandre89's answer è buono ma non perfetto. Ho passato un po 'di tempo sull'argomento e ho una soluzione funzionante.

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" />

Ecco my CodePen

Ci sono alcuni punti da notare, però.

  1. caratteri Unicode da U+1F000 up hanno bisogno di una notazione speciale, in modo da poter utilizzare la via di sandre89, oppure optare per la \u{1F000} ES6 di notazione, che può o non può funzionare con il vostro minificator. Sono riuscito a incollare gli emoji direttamente nello script con codifica UTF-8.

  2. Non dimenticare il flag u durante l'espressione regolare o il tuo motore di Javascript potrebbe generare un errore.

Attenzione che le cose potrebbero non funzionare a causa della codifica del file, set di caratteri, o minificator. Nel mio caso non ha funzionato fino a quando non ho rimosso lo script da un file .isml (Demandware) e incollato in un file .js.

È possibile ottenere alcune informazioni facendo riferimento a Wikipedia Emoji page e How many bytes does one Unicode character take? e armeggiando con questo Online Unicode converter, come ho fatto io.

Problemi correlati