簡體   English   中英

如何在javascript中刪除一組表情符號的最后一個表情符號?

[英]How can I remove the last emoji of a group of emojis in javascript?

假設我在一個字符串中有這 3 個表情符號:😀🎃👪

字符串中除了表情符號之外沒有任何空格或任何其他字符。

如何刪除javascript中的最后一個表情符號?

你可以這樣做。 它將始終刪除最后一個表情符號。

 function removeEmoji() { var emoStringArray = document.getElementById('emoji').innerHTML; var lastIndex = emoStringArray.lastIndexOf(" "); var stripedEmoStringArray = emoStringArray.substring(0, lastIndex); document.getElementById('emoji').innerHTML = stripedEmoStringArray; }
 <p id="emoji"> 😀 🎃 👪 </p> <button onclick="removeEmoji()">Remove</button>

我希望這就是你想要的。

var emoString = "😀 🎃 👪";
emoString = emoString.slice(0, -2);

但是,這僅在您總共有 3 個表情符號時才有效。 因此,要實現通用解決方案,您可以使用下划線函數split()和 javascript 函數join()

var emoString = "😀 🎃 👪";
emoString = _.rest(emoString.split(' ')).join(' ')

希望這能解決您的問題。

好的,這是我解決它的方法:

function deleteEmoji(emojiStr) {
    let emojisArray = emojiStr.match(/([\uD800-\uDBFF][\uDC00-\uDFFF])/g);
    emojisArray = emojisArray.splice(0, emojisArray.length - 1);
    return emojisArray.join("");
}
let emojitext = "😀🎃👪";
console.log(deleteEmoji(emojitext));

我真的很驚訝在這個時代,瀏覽器仍然不完全支持 unicode。 我認為這很大程度上取決於 Windows 和它的 UTF-16 版本。

我相信 OP 已經找到了他自己的原始問題解決方案,但我認為必須有一個更通用的解決方案來代理對 unicode 字符。

無論如何,所以我的解決方案是將文本轉換為 UTF-32 數組,然后可以使用切片等更輕松地操作這些數組。

在對數組完成您想要的操作后,只需轉換回來即可。

下面是一個例子。

我從中獲得的一些代碼 -> 是否可以將包含“高”unicode 字符的字符串轉換為由派生自 utf-32(“真實”)代碼的 dec 值組成的數組? http://speakingjs.com/es5/ch24.html

 function decodeUnicode(str) { const r = []; let i = 0; while(i < str.length) { let chr = str.charCodeAt(i++); if(chr >= 0xD800 && chr <= 0xDBFF) { var low = str.charCodeAt(i++); r.push(0x10000 + ((chr - 0xD800) << 10) | (low - 0xDC00)); } else { r.push(chr); } } return r; } function toUTF16(codePoint) { const TEN_BITS = parseInt('1111111111', 2); if (codePoint <= 0xFFFF) { return codePoint; } codePoint -= 0x10000; const leadingSurrogate = 0xD800 | (codePoint >> 10); const trailingSurrogate = 0xDC00 | (codePoint & TEN_BITS); return String.fromCharCode(leadingSurrogate) + String.fromCharCode(trailingSurrogate); } function encodeUnicode(data) { return data.reduce((a, v) => { a += toUTF16(v); return a; },""); } var unicode = decodeUnicode("😀🎃👪"); for (let l = 0; l < unicode.length; l ++) console.log(encodeUnicode( unicode.slice(0, l ? -l : unicode.length))); console.log("pick some random ones"); let str = ""; for (let l = 0; l < 20; l ++) { let rnd = Math.trunc(Math.random()*unicode.length); str += encodeUnicode(unicode.slice(rnd,rnd+1)); } console.log(str);

下面的答案不使用任何特殊包並安全地刪除最后一個表情符號

function safeEmojiBackspace(str)
{
  let initialRealCount = fancyCount(str);
  while(fancyCount(str) !== initialRealCount - 1)
  {
      str = str.substring(0,str.length - 1);
  }
  return str;
}
function fancyCount(str){
  const joiner = "\u{200D}";
  const split = str.split(joiner);
  let count = 0;
  for(const s of split){
    //removing the variation selectors
    const num = Array.from(s.split(/[\ufe00-\ufe0f]/).join("")).length;
    count += num;
  }
  //assuming the joiners are used appropriately
  return count / split.length;
}

示例用法

let str = "something😀🎃👪";
str = safeEmojiBackspace(str);//"something😀🎃"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM