it-swarm.com.de

ersetzen Sie das Emoji-Unicode-Symbol mithilfe von Regexp in Javascript

Wie Sie alle wissen, sind emoji Symbole mit bis zu 3 oder 4 Bytes codiert, so dass sie 2 Symbole in meiner Zeichenfolge einnehmen können. Zum Beispiel '???? wew ????'. Length = 7 Ich möchte diese Symbole in meinem Text finden und sie durch den Wert ersetzen, der vom Code abhängig ist. Beim Lesen von SO bin ich auf die XRegExp-Bibliothek mit dem Unicode-Plugin gestoßen, aber ich habe nicht den Weg gefunden, wie es funktioniert.

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

Ich möchte die Zeichenfolge wirklich nicht bruteforce auf der Suche nach der Reihenfolge der Zeichen aus meinem Bereich. Könnte mir jemand helfen, mit regexp's den Weg zu finden? 

EDITIERT Ich kam gerade auf die Idee, alle Emoji-Symbole aufzulisten. Besser als Brutforce, aber immer noch auf der Suche nach der besseren Idee

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

Die \u....-Schreibweise hat vier hexadezimale Ziffern (nicht weniger und nicht mehr) und kann daher nur Codepunkte bis zu U + FFFF darstellen. Unicode-Zeichen darüber werden als Paare von Ersatzcode-Punkten dargestellt.

Daher ist ein indirekter Ansatz erforderlich. Vgl. zu JavaScript-Strings außerhalb von BMP .

Sie könnten beispielsweise nach Codepunkten im Bereich [\uD800-\uDBFF] (hohe Surrogate) suchen. Wenn Sie einen Punkt finden, überprüfen Sie, ob der nächste Codepunkt in der Zeichenfolge im Bereich [\uDC00-\uDFFF] liegt (andernfalls liegt ein schwerwiegender Datenfehler vor.) interpretieren Sie die beiden als Unicode-Zeichen und ersetzen Sie sie durch das, was Sie möchten. Das sieht aus wie ein Job für eine einfache Schleife durch den String und nicht wie ein regulärer Ausdruck.

12

vielleicht können Sie einen Blick auf diesen Artikel werfen: http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript

der Emoji-Unicode von \u1F601 bis \u1F64F

Übersetzen Sie zum Utf-16 von Javascript ist \ud83d\ude00 in \ud83d\ude4f.

das erste Zeichen ist immer \ud83d.

also ist das reg out: 

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

hoffe das kann etwas helfen

6
shuizhongyuemin

Das ist etwas alt, aber ich habe dieses Problem untersucht und es scheint, dass Bradley Momberger hier eine nette Lösung dazu gepostet hat: http://airhadoken.github.io/2015/04/22/javascript-string-handling-emoji.html

Der Regex, den er vorschlägt, ist:

/[\uD800-\uDFFF]./ // This matches emoji

Dieser reguläre Ausdruck entspricht dem Kopf-Surrogat, das von Emojis verwendet wird, und dem Zeichen, das dem Kopf-Surrogat folgt (von dem angenommen wird, dass es das Schwanz-Surrogat ist). Daher sollten alle Emojis korrekt und mit übereinstimmen

.replace(/[\uD800-\uDFFF]./g,'')

sie sollten in der Lage sein, alle Emojis zu entfernen.

Bearbeiten: Besserer regulärer Ausdruck gefunden. Die obige Regex vermisst einige Emojis.

Aber es gibt einen reddit Post mit einer Version, für die ich kein Emoji finde, das von der Regel ausgenommen ist. Der Reddit ist hier: https://www.reddit.com/r/tasker/comments/4vhf2f/how_to_regex_emojis_in_tasker_for_search_match_or/ Und der Regex ist:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/

Verwenden Sie den Modifikator g, um alle Vorkommen abzugleichen:

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

Second Edit : Wie CodeToad richtig hervorhob, wird ✨ vom obigen Regex nicht erkannt, da es sich im Dingbats-Block befindet (dank air_hadoken).

Die Lodash-Bibliothek hat einen ausgezeichneten Emoji Regex-Block entwickelt:

(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*

Kevin Scott hat schön zusammengestellt, was dieser Regex in seinem Blog Post behandelt. Spoiler: Es enthält Dingbats ????

5
  1. /\ud83d [\ ude00-\ude4f]/g

nicht alle emojis wie: ???? ???? ???? ???? ???? ???? ???? ????, siehe http://getemoji.com/ und probiere deinen Regex https://regex101.com/

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

nicht alle emojis enthalten wie: ⛑ ⛑ ☹️☺️⛩⛱ ☹️☺️⛩⛱ ™ ️ © ️ ®️ ➰ ➿

  1. Selbst diese Regex erlaubt es nicht, alle Emojis zu entfernen ... ???? ???? ???? ???? ???? ???? : 

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

Kannst du dann sagen, warum diese Regex schlecht ist, um alle exotischen Charaktere und Emojis zu entfernen?

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

Das folgende Regex-Muster funktionierte für mich in Java.

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

Da Java String die UTF-16-Codierung verwendet und Emojis ebenfalls über 0xFFFF liegen, werden bei diesem regulären Ausdrückmuster Surrogatpaare zur Identifizierung von Emojis berücksichtigt.

0
Ratnesh Thakur

So entfernen Sie alle möglichen Emojis:

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