web-dev-qa-db-fra.com

Comment puis-je supprimer emoji de la chaîne

Mon problème est de supprimer les emoji d'une chaîne, mais pas les caractères CJK (chinois, japonais, coréen) d'une chaîne utilisant regex. J'ai essayé d'utiliser cette regex:

REGEX = /[^\u1F600-\u1F6FF\s]/i

Cette expression rationnelle fonctionne bien, sauf qu'elle détecte également les caractères chinois, japonais et coréen où j'ai besoin de ces caractères. Une idée de comment résoudre ce problème?

18
kilua

Karol S a déjà fourni une solution , mais la raison peut ne pas être claire:

"\u1F600" est en réalité "\u1F60" suivi de "0":

"\u1F60"    # => "ὠ"
"\u1F600"   # => "ὠ0"

Vous devez utiliser des accolades pour les points de code supérieurs à FFFF:

"\u{1F600}" #=> "????"

Par conséquent, la classe de caractères [\u1F600-\u1F6FF] est interprétée comme étant [\u1F60 0-\u1F6F F], c’est-à-dire qu’elle .__ correspond au "\u1F60", à la plage "0".."\u1F6F" et au "F".

L'utilisation d'accolades résout le problème:

/[\u{1F600}-\u{1F6FF}]/

Cela correspond aux caractères (emoji) dans ces blocs unicode:


Vous pouvez également utiliser unpack , pack , et between? pour obtenir un résultat similaire. Cela fonctionne également pour Ruby 1.8.7 qui ne prend pas en charge Unicode dans les expressions régulières. 

s = 'Hi!????'
#=> "Hi!\360\237\230\200"

s.unpack('U*').reject{ |e| e.between?(0x1F600, 0x1F6FF) }.pack('U*')
#=> "Hi!" 

Concernant votre exemple - Rubular - Emoji sont des caractères uniques:

"????".length  #=> 1
"????".chars   #=> ["????"]

Considérant que kaomoji est une combinaison de plusieurs caractères:

"^_^".length #=> 3
"^_^".chars  #=> ["^", "_", "^"]

Faire correspondre ces éléments est une tâche très différente (et vous devriez le demander dans une question distincte).

28
Stefan

Cette expression régulière correspond aux 845 emoji, extraits de caractères Unicode Emoji destinés à être utilisés sur le Web :

[\u{203C}\u{2049}\u{20E3}\u{2122}\u{2139}\u{2194}-\u{2199}\u{21A9}-\u{21AA}\u{231A}-\u{231B}\u{23E9}-\u{23EC}\u{23F0}\u{23F3}\u{24C2}\u{25AA}-\u{25AB}\u{25B6}\u{25C0}\u{25FB}-\u{25FE}\u{2600}-\u{2601}\u{260E}\u{2611}\u{2614}-\u{2615}\u{261D}\u{263A}\u{2648}-\u{2653}\u{2660}\u{2663}\u{2665}-\u{2666}\u{2668}\u{267B}\u{267F}\u{2693}\u{26A0}-\u{26A1}\u{26AA}-\u{26AB}\u{26BD}-\u{26BE}\u{26C4}-\u{26C5}\u{26CE}\u{26D4}\u{26EA}\u{26F2}-\u{26F3}\u{26F5}\u{26FA}\u{26FD}\u{2702}\u{2705}\u{2708}-\u{270C}\u{270F}\u{2712}\u{2714}\u{2716}\u{2728}\u{2733}-\u{2734}\u{2744}\u{2747}\u{274C}\u{274E}\u{2753}-\u{2755}\u{2757}\u{2764}\u{2795}-\u{2797}\u{27A1}\u{27B0}\u{2934}-\u{2935}\u{2B05}-\u{2B07}\u{2B1B}-\u{2B1C}\u{2B50}\u{2B55}\u{3030}\u{303D}\u{3297}\u{3299}\u{1F004}\u{1F0CF}\u{1F170}-\u{1F171}\u{1F17E}-\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E7}-\u{1F1EC}\u{1F1EE}-\u{1F1F0}\u{1F1F3}\u{1F1F5}\u{1F1F7}-\u{1F1FA}\u{1F201}-\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}-\u{1F251}\u{1F300}-\u{1F320}\u{1F330}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F380}-\u{1F393}\u{1F3A0}-\u{1F3C4}\u{1F3C6}-\u{1F3CA}\u{1F3E0}-\u{1F3F0}\u{1F400}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4F7}\u{1F4F9}-\u{1F4FC}\u{1F500}-\u{1F507}\u{1F509}-\u{1F53D}\u{1F550}-\u{1F567}\u{1F5FB}-\u{1F640}\u{1F645}-\u{1F64F}\u{1F680}-\u{1F68A}]

J'ai généré cette expression rationnelle directement à partir de la liste brute d'emoji Unicode. L'algorithme est ici: https://github.com/franklsf95/Ruby-emoji-regex .

Exemple d'utilisation:

regex = /[\u{203C}\u{2049}\u{20E3}\u{2122}\u{2139}\u{2194}-\u{2199}\u{21A9}-\u{21AA}\u{231A}-\u{231B}\u{23E9}-\u{23EC}\u{23F0}\u{23F3}\u{24C2}\u{25AA}-\u{25AB}\u{25B6}\u{25C0}\u{25FB}-\u{25FE}\u{2600}-\u{2601}\u{260E}\u{2611}\u{2614}-\u{2615}\u{261D}\u{263A}\u{2648}-\u{2653}\u{2660}\u{2663}\u{2665}-\u{2666}\u{2668}\u{267B}\u{267F}\u{2693}\u{26A0}-\u{26A1}\u{26AA}-\u{26AB}\u{26BD}-\u{26BE}\u{26C4}-\u{26C5}\u{26CE}\u{26D4}\u{26EA}\u{26F2}-\u{26F3}\u{26F5}\u{26FA}\u{26FD}\u{2702}\u{2705}\u{2708}-\u{270C}\u{270F}\u{2712}\u{2714}\u{2716}\u{2728}\u{2733}-\u{2734}\u{2744}\u{2747}\u{274C}\u{274E}\u{2753}-\u{2755}\u{2757}\u{2764}\u{2795}-\u{2797}\u{27A1}\u{27B0}\u{2934}-\u{2935}\u{2B05}-\u{2B07}\u{2B1B}-\u{2B1C}\u{2B50}\u{2B55}\u{3030}\u{303D}\u{3297}\u{3299}\u{1F004}\u{1F0CF}\u{1F170}-\u{1F171}\u{1F17E}-\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E7}-\u{1F1EC}\u{1F1EE}-\u{1F1F0}\u{1F1F3}\u{1F1F5}\u{1F1F7}-\u{1F1FA}\u{1F201}-\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}-\u{1F251}\u{1F300}-\u{1F320}\u{1F330}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F380}-\u{1F393}\u{1F3A0}-\u{1F3C4}\u{1F3C6}-\u{1F3CA}\u{1F3E0}-\u{1F3F0}\u{1F400}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4F7}\u{1F4F9}-\u{1F4FC}\u{1F500}-\u{1F507}\u{1F509}-\u{1F53D}\u{1F550}-\u{1F567}\u{1F5FB}-\u{1F640}\u{1F645}-\u{1F64F}\u{1F680}-\u{1F68A}]/
str = "I am a string with emoji ???????????????????????????????? and other Unicode characters 比如中文."
str.gsub regex, ''
# "I am a string with emoji  and other Unicode characters 比如中文."

Les autres caractères Unicode, tels que les caractères asiatiques, sont préservés.

EDIT: J'ai mis à jour la regex pour exclure les nombres et les symboles ASCII. Voir les commentaires pour plus de détails.

14
franklsf95

J'utilise un basé sur ce script .

 def strip_emoji(text)
    text = text.force_encoding('utf-8').encode
    clean = ""

    # symbols & pics
    regex = /[\u{1f300}-\u{1f5ff}]/
    clean = text.gsub regex, ""

    # enclosed chars 
    regex = /[\u{2500}-\u{2BEF}]/ # I changed this to exclude chinese char
    clean = clean.gsub regex, ""

    # emoticons
    regex = /[\u{1f600}-\u{1f64f}]/
    clean = clean.gsub regex, ""

    #dingbats
    regex = /[\u{2702}-\u{27b0}]/
    clean = clean.gsub regex, ""
  end

Résultats:

irb> strip_emoji("????????☂❤华み원❤")
=> "华み원"
14
jellene
REGEX = /[^\u{1F600}-\u{1F6FF}\s]/

ou

REGEX = /[\u{1F600}-\u{1F6FF}\s]/
REGEX = /[\u{1F600}-\u{1F6FF}]/
REGEX = /[^\u{1F600}-\u{1F6FF}]/

parce que votre regex originale semble indiquer que vous essayez de trouver tout ce qui n'est pas un amoji et pas un espace et je ne sais pas pourquoi vous voudriez le faire.

Également:

  • les emoji sont 1F300-1F6FF au lieu de 1F600-1F6FF; vous voudrez peut-être changer cela

  • si vous souhaitez supprimer tous les caractères astraux (par exemple, vous utilisez un logiciel ne prenant pas en charge tous les caractères Unicode), vous devez utiliser 10000-10FFFF.

EDIT: Vous voulez presque certainement REGEX = /[\u{1F600}-\u{1F6FF}]/ ou similaire. Votre expression rationnelle originale correspond à tout ce qui n'est pas un espace, ni à la plage 0-\u1F6F. Étant donné que les espaces sont des espaces et que les lettres anglaises sont dans la plage 0-\u1F6F, et que les caractères chinois ne le sont pas, l'expression rationnelle correspond aux caractères chinois et les a supprimés.

8
Karol S

CARE la réponse de Aray a des effets secondaires.

"-".gsub(/[^\p{L}\s]+/, '').squeeze(' ').strip
=> ""

même lorsque cela est supposé être un simple moins (-)

1
Filipe Santiago

Au lieu de supprimer les caractères Emoji, vous pouvez uniquement inclure des alphabets et des chiffres. Un simple tr devrait faire l'affaire, .tr('^A-Za-z0-9', ''). Bien sûr, cela supprimera toute ponctuation, mais vous pouvez toujours modifier l'expression rationnelle en fonction de votre condition.

1
Swaathi Kakarla

Ce très court Regex couvre tout Emoji dans getemoji.com jusqu'à présent

[\u{1F300}-\u{1F5FF}|\u{1F1E6}-\u{1F1FF}|\u{2700}-\u{27BF}|\u{1F900}-\u{1F9FF}|\u{1F600}-\u{1F64F}|\u{1F680}-\u{1F6FF}|\u{2600}-\u{26FF}]
1
Tan

La plupart des réponses dans ce fil ne suppriment pas tous les emojis correctement. Ils enlèvent des émojis simples comme ???? bien. Mais ils ne supprimeront pas complètement les émojis multi-points de type code comme ???? ou, laissant des points de code unicode résiduels derrière.

Vous pouvez utiliser une gemme telle que unicode-emoji pour obtenir les dernières expressions rationnelles emoji, mais si vous trouvez que cela est excessif, le code suivant pourrait être une solution suffisante:

text.gsub(/[^[:alnum:][:blank:][:punct:]]/, '').squeeze(' ').strip

Cela supprimera tout caractère emoji ou étrange ressemblant à unicody qui n’est pas un alphanum/punct/blank de base unicode.

0
Jerome Dalbert

J'ai converti le RegEx du projet Ruby ci-dessus en un RegEx prenant en charge JavaScript:

    /// <summary>
    /// Emoji symbols character sets (added \s and +)
    /// Unicode with עברית Delete the emoji to match ????
    /// https://regex101.com/r/jP5jC5/3
    /// https://github.com/franklsf95/Ruby-emoji-regex
    /// http://stackoverflow.com/questions/24672834/how-do-i-remove-emoji-from-string
    /// </summary>
    public const string Emoji = @"^[\s\u00A9\u00AE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9-\u21AA\u231A-\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA-\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614-\u2615\u2618\u261D\u2620\u2622-\u2623\u2626\u262A\u262E-\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267B\u267F\u2692-\u2694\u2696-\u2697\u2699\u269B-\u269C\u26A0-\u26A1\u26AA-\u26AB\u26B0-\u26B1\u26BD-\u26BE\u26C4-\u26C5\u26C8\u26CE-\u26CF\u26D1\u26D3-\u26D4\u26E9-\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733-\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934-\u2935\u2B05-\u2B07\u2B1B-\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u1F004\u1F0CF\u1F170-\u1F171\u1F17E-\u1F17F\u1F18E\u1F191-\u1F19A\u1F201-\u1F202\u1F21A\u1F22F\u1F232-\u1F23A\u1F250-\u1F251\u1F300-\u1F321\u1F324-\u1F393\u1F396-\u1F397\u1F399-\u1F39B\u1F39E-\u1F3F0\u1F3F3-\u1F3F5\u1F3F7-\u1F4FD\u1F4FF-\u1F53D\u1F549-\u1F54E\u1F550-\u1F567\u1F56F-\u1F570\u1F573-\u1F579\u1F587\u1F58A-\u1F58D\u1F590\u1F595-\u1F596\u1F5A5\u1F5A8\u1F5B1-\u1F5B2\u1F5BC\u1F5C2-\u1F5C4\u1F5D1-\u1F5D3\u1F5DC-\u1F5DE\u1F5E1\u1F5E3\u1F5EF\u1F5F3\u1F5FA-\u1F64F\u1F680-\u1F6C5\u1F6CB-\u1F6D0\u1F6E0-\u1F6E5\u1F6E9\u1F6EB-\u1F6EC\u1F6F0\u1F6F3\u1F910-\u1F918\u1F980-\u1F984\u1F9C0}]+$";

Usage:

if (!Regex.IsMatch(vm.NameFull, RegExKeys.Emoji)) // Match means no Emoji was found
0
Yovav