web-dev-qa-db-fra.com

remplacer le symbole unicode emoji en utilisant l'expression rationnelle en javascript

Comme vous le savez tous, les symboles emoji sont codés sur 3 ou 4 octets, de sorte qu’ils peuvent occuper 2 symboles dans ma chaîne. Par exemple, «wew ????». Length = 7 Je souhaite trouver ces symboles dans mon texte et les remplacer par la valeur qui dépend de son code. En lisant SO, je suis arrivé à la bibliothèque XRegExp avec le plugin unicode, mais je n’ai pas trouvé le moyen de le faire fonctionner.

var str = '????wew????';// \u1F601 symbol
var reg = XRegExp('[\u1F601-\u1F64F]', 'g'); //  /[ὠ1-ὤF]/g -doesn't make a lot of sense  
//var reg = XRegExp('[\uD83D\uDE01-\uD83D\uDE4F]', 'g'); //Range out of order in character class
//var reg = XRegExp('\\p{L}', 'g'); //doesn't match my symbols
console.log(XRegExp.replace(str, reg, function(match){
   return encodeURIComponent(match);// here I want to have smth like that %F0%9F%98%84 to be able to map anything I want to this value and replace to it
}));

jsfiddle

Je ne veux vraiment pas forcer brutalement la chaîne à chercher la séquence de caractères de ma gamme. Quelqu'un pourrait-il m'aider à trouver le moyen de le faire avec les expressions rationnelles? 

_ ÉDITÉ Je viens juste de penser à énumérer tous les symboles emoji. Mieux que brutforce mais cherche toujours la meilleure idée

var reg = XRegExp('\uD83D\uDE01|\uD83D\uDE4F|...','g');
10
Fedor Skrynnikov

La notation \u.... a quatre chiffres hexadécimaux, pas moins, pas plus, elle ne peut donc représenter que des points de code allant jusqu'à U + FFFF. Les caractères Unicode ci-dessus sont représentés par des paires de points de code de substitution.

Une approche indirecte est donc nécessaire. Cf. to Chaînes JavaScript en dehors du BMP .

Par exemple, vous pouvez rechercher des points de code dans la plage [\uD800-\uDBFF] (substituts élevés) et, lorsque vous en trouvez un, vérifiez que le prochain point de code de la chaîne est dans la plage [\uDC00-\uDFFF] (sinon, il y a une grave erreur de données), interprétez les deux comme un caractère Unicode et remplacez-les par ce que vous souhaitez y mettre. Cela ressemble à un travail pour une simple boucle dans la chaîne, plutôt qu'une expression régulière.

12
Jukka K. Korpela

peut-être pouvez-vous jeter un coup d'œil à cet article: http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript

les emoji unicode de \u1F601 à \u1F64F

traduire en javascript utf-16 est \ud83d\ude00 à \ud83d\ude4f

le premier caractère est toujours \ud83d.

donc le reg est sorti: 

/\ud83d[\ude00-\ude4f]/g

espérons que cela peut aider

6
shuizhongyuemin
  1. /\ud83d [\ ude00-\ude4f]/g

ne comprenant pas tous les emojis comme: ???? ???? ???? ???? ???? ???? ???? ????, voir http://getemoji.com/ et essayez votre regex https://regex101.com/

  1. / [\ uD83C-\uDBFF\uDC00-\uDFFF] +/g 

n'incluant pas tous les émojis tels que: ☁️☄️ ☹️☺️⛩⛱ ™ © ️ ® ➰

  1. Même cette expression rationnelle ne vous permet pas de supprimer tous les emojis ... ???? ???? ???? ???? ???? ???? : 

https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79

Ensuite, pouvez-vous dire pourquoi vous pensez que ces expressions rationnelles sont mauvaises pour supprimer tous les personnages exotiques et les émojis?

/[\u1000-\uFFFF]+/g
1
Adrien Parrochia

Le motif ci-dessous regex a fonctionné pour moi en Java.

"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"

Comme Java String utilise le codage UTF-16 et que les emoji sont également supérieurs à 0xFFFF, ce modèle d'expression régulière considère des paires de substitution pour identifier les emojis.

0
Ratnesh Thakur

Pour supprimer tous les émoticônes possibles:

new RegExp('[\u1000-\uFFFF]+', 'g');
0
Adrien Parrochia