Хорошо, так получается, у меня только что был небольшой психический блок.
Чтобы найти смайлики, мне не нужно получать индексы, как упомянуто WolverinDEV . Хотя использование string.replace
с /\p{Emoji}/gu
не работает, так как это разбивает, например, на ??♂️, ? и ♂. Поэтому я настроил регулярное выражение для учета этого: /[\p{Emoji}\u200d]+/gu
. Теперь смайлики возвращаются полностью, потому что включены столяр нулевой ширины.
Это то, что я получил (если кому-то все равно):
const replaceEmojis = function (string) {
const emojis = string.match(/[\p{Emoji}\u200d]+/gu);
// console.log(emojis);
// replace emojis with SVGs
emojis.forEach(emoji => {
// get the unicodes of the emoji
let unicode = "";
function getNextChar(pointer) {
const subUnicode = emoji.codePointAt(pointer);
if (!subUnicode) return;
unicode += '-' + subUnicode.toString(16);
getNextChar(++pointer);
}
getNextChar(0);
unicode = unicode.substr(1); // remove the beginning dash '-'
console.log(unicode.toUpperCase());
// replace emoji here
// string = string.replace(emoji, `<svg src='path/to/svg/${unicode}.svg'>`)
})
return string;
}
Это все еще требует работы, например, из-за Низкий Суррогаты в выводимом юникоде, но, по сути, это работает.
РЕДАКТИРОВАТЬ:
Первое улучшение:
Возможно, вам это не нужно избавиться от суррогатных символов с низким добавлением добавить условие в getNextChar()
if (!(subUnicode >= 56320 && subUnicode <= 57343)) unicode += '-' + subUnicode.toString(16);
Добавляет код символа, только если он не является суррогатным символом с низким уровнем.
Второе улучшение:
Добавьте селектор вариантов 16 (U + FE0F) к регулярному выражению, чтобы выбрать больше emojis en blo c:
/[\p{Emoji}\u200d\ufe0f]+/gu