замените символ Юникода emoji с помощью regexp в javascript
Как вы все знаете emoji символы кодируются до 3 или 4 байт, поэтому они могут занимать 2 символа в моей строке. Например'
8 ответов
на \u....
нотация имеет четыре шестнадцатеричные цифры, не меньше, не больше, поэтому она может представлять только кодовые точки до U+FFFF. Символы юникода выше представлены в виде пар суррогатных кодовых точек.
поэтому необходим какой-то косвенный подход. Ср. к строки JavaScript вне BMP.
например, вы можете искать кодовые точки в диапазоне [\uD800-\uDBFF]
(высокие суррогаты), и когда вы найдете один, проверьте, что следующая кодовая точка в строке находится в диапазон [\uDC00-\uDFFF]
(если нет, есть серьезная ошибка данных), интерпретируйте их как символ Юникода и замените их тем, что вы хотите поместить туда. Это похоже на задание для простого цикла через строку, а не на регулярное выражение.
возможно, вы можете взглянуть на эту статью:http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript
Юникод emoji от \u1F601
to \u1F64F
перевести на utf-16 javascript является \ud83d\ude00
to \ud83d\ude4f
первый символ всегда \ud83d
.
Итак, reg вышел:
/\ud83d[\ude00-\ude4f]/g
надеюсь, это может помочь
Это несколько старый, но я рассматривал эту проблему и, кажется, Брэдли Momberger будет решение это здесь: http://airhadoken.github.io/2015/04/22/javascript-string-handling-emoji.html
регулярное выражение, которое он предлагает:
/[\uD800-\uDFFF]./ // This matches emoji
это регулярное выражение соответствует головному суррогату, который используется emojis, и charracter, следующий за головным суррогатом (который, как предполагается, является хвостовым суррогатом). Таким образом, все emojis должно быть сопоставлено правильно и с
.replace(/[\uD800-\uDFFF]./g,'')
вы должны иметь возможность удалить все emojis.
Edit: лучшее регулярное выражение найдено. Вышеуказанное регулярное выражение пропускает некоторые смайлики.
но есть сообщение reddit с версией, для которой я не могу найти emoji, который исключен из правила. На реддите здесь: https://www.reddit.com/r/tasker/comments/4vhf2f/how_to_regex_emojis_in_tasker_for_search_match_or/ И регулярное выражение есть:
/[\uD83C-\uDBFF\uDC00-\uDFFF]+/
чтобы соответствовать всем случаям, используйте модификатор g:
/[\uD83C-\uDBFF\uDC00-\uDFFF]+/g
Вторая Правка: Как правильно указал CodeToad, не распознается вышеуказанным регулярным выражением, потому что оно находится в блоке dingbats (благодаря air_hadoken).
библиотека lodash придумала отличный блок регулярных выражений Emoji:
(?:[\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])?)*
Кевин Скотт красиво сложил, что это regex охватывает в его Блоге. Спойлер: он включает в себя dingbats
- / \ ud83d [\ude00 - \ude4f] / g
не включая все смайлики, такие как:, см. http://getemoji.com/ и попробуйте regex https://regex101.com/
- / [\uD83C - \uDBFF\uDC00 - \uDFFF]+ / g
не включая все смайлики, как : ☕️ ☁️☄️ ☀️☃️ ️ ❄️ ☹️☺️™️ ©️ ®️ 〰️
- даже это выражение не позволяет удалить все смайлики... :
https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79
тогда, можете ли вы сказать, почему вы думаете, что эти регулярные выражения плохо удалить все экзотические символы и смайлики ?
/[\u1000-\uFFFF]+/g
ниже шаблона regex работал для меня в java.
"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"
поскольку строка java использует кодировку UTF-16, а также emoji выше 0xFFFF, этот шаблон regex рассматривает суррогатные пары для идентификации смайликов.
может быть, вы должны использовать replace таким образом?
reg = str.replace(new RegExp('','g'),'');
попробуйте https://github.com/iLeonidze/emoji.js
emoji в диапазоне от U+1F600 до U+1F64F
вы можете использовать эту строку в своем скрипте для отправки с Json:
text.replace(/[\u1F60-\u1F64]|[\u2702-\u27B0]|[\u1F68-\u1F6C]|[\u1F30-\u1F70]{\u2600-\u26ff]/g, "");