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
}));
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');
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.
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
ne comprenant pas tous les emojis comme: ???? ???? ???? ???? ???? ???? ???? ????, voir http://getemoji.com/ et essayez votre regex https://regex101.com/
n'incluant pas tous les émojis tels que: ☁️☄️ ☹️☺️⛩⛱ ™ © ️ ® ➰
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
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.
Pour supprimer tous les émoticônes possibles:
new RegExp('[\u1000-\uFFFF]+', 'g');