如何在javascript中删除一组表情符号中的最后一个表情符号?

4

假设我有一个包含三个表情的字符串:

字符串中除表情符号外没有任何空格或其他字符。

如何在Javascript中删除最后一个表情符号?


{btsdaf} - Walk
7
你应该查看这篇帖子: https://dev59.com/lGAf5IYBdhLWcg3wizOu - laruiss
5个回答

2
下面的答案不使用任何特殊包,并安全地删除最后一个表情符号。
function safeEmojiBackspace(str)
{
  let initialRealCount = fancyCount(str);
  while(str.length > 0 && 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"

0

你可以这样做。它将始终删除最后一个表情符号。

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>


2
{btsdaf} - jordins

0

我希望这是你想要的。

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

但是,这只适用于您总共有3个表情符号的情况。因此为了实现一般化的解决方案,您可以使用下划线函数split()和javascript函数join()

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

希望这能解决你的问题。


{btsdaf} - jordins
@jordins 现在看一下答案。希望这可以解决你的问题。 - Zac

0

我其实很惊讶于Unicode在当今时代仍未得到浏览器的全面支持。我认为这在很大程度上要归咎于Windows及其UTF-16版本。

我相信原帖的作者已经找到了自己的解决方案,但我认为必须有一种更通用的解决方法来处理代理对Unicode字符。

无论如何,我的解决方案是将文本转换为UTF-32数组,这样可以更轻松地进行操作,使用slice等。

完成所需的操作后,只需进行转换即可。

以下是一个示例。

我从以下链接中获取了部分代码-> Is it possible to convert a string containing "high" unicode chars to an array consisting of dec values derived from utf-32 ("real") codes?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);


What is the function "u"? - jordins
{btsdaf} - Keith

0

好的,这是我解决它的方法:

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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接