El código JS para detectar emojis (en el sentido habitual del término "emoji") es simplemente:
let str = "..."; if(/\p{Extended_Pictographic}/u.test(str)) { // do something }¿Hay alguna forma igualmente simple de detectar emojis que puedan tener modificadores de tono de piel agregados de manera válida?
Un requisito clave es que no tengo que actualizar la expresión regular a lo largo de los años a medida que se agregan más emojis o los emojis existentes se vuelven compatibles con el tono de la piel. Básicamente, me pregunto si hay algo como un escape de propiedad Skin Unicode, o alguna otra solución elegante y preparada para el futuro .
Notas:
👶 (no tiene modificador de tono de piel, pero es válido para añádele uno).Puede usar la escala de Fitzpatrick para detectar un emoji del tono de la piel. Un emoji con un tono de piel contendrá cualquiera de los seis unicodes de la escala de Fitzpatrick.
EDITAR:
Esta solución utiliza Element.getBoundingClientRect() para determinar si un emoji tendrá el mismo ancho y alto después de haber concatenado el emoji del tono de piel de Fitzpatrick.
function isEmojiSkinToneAdaptable(emoji) { const SKIN_TONES = [ '\u{1f3fb}', // skin tone 1 & 2 '\u{1f3fc}', // skin tone 3 '\u{1f3fd}', // skin tone 4 '\u{1f3fe}', // skin tone 5 '\u{1f3ff}', // skin tone 6 ]; function getRemovedSkinToneEmoji(emoji) { let emojiCopy = ' '.concat(emoji).slice(1); SKIN_TONES.forEach(skinTone => { emojiCopy = emojiCopy.replace(skinTone, ''); }) return emojiCopy; } function getEmojiRects(emoji) { let span = document.createElement('span'); span.style.position = 'fixed'; span.style.top = '-99999px'; span.textContent = emoji; document.body.append(span); let emojiRects = span.getBoundingClientRect(); span.remove(); return emojiRects; } let baseEmoji = getRemovedSkinToneEmoji(emoji); let skinToneEmoji = baseEmoji + SKIN_TONES[1]; let baseEmojiRects = getEmojiRects(baseEmoji); let skinToneEmojiRects = getEmojiRects(skinToneEmoji); return baseEmojiRects.width === skinToneEmojiRects.width && baseEmojiRects.height === skinToneEmojiRects.height; } console.log(`Human with skin tone: ${isEmojiSkinToneAdaptable('👶🏽')}`); // true console.log(`Thumbs up without skin tone: ${isEmojiSkinToneAdaptable('👍')}`); // true console.log(`Animal: ${isEmojiSkinToneAdaptable('🦁')}`); // falseLa propiedad de carácter Unicode relevante se llama Emoji_Modifier_Base . /\p{Emoji_Modifier_Base}/u.test() devolverá verdadero para cada carácter emoji que pueda tener un modificador de tono de piel.