假设我在字符串中有这3个表情符号:
字符串中除了表情符号外没有任何空格或任何其他字符。
如何删除javascript中的最后一个表情符号?
答案 0 :(得分: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>
&#13;
答案 1 :(得分:0)
我希望这就是你想要的。
var emoString = " ";
emoString = emoString.slice(0, -2);
但是,只有当你总共有3个表情符号时,这才有用。因此,要实现通用解决方案,您可以使用下划线函数split()
和javascript函数join()
:
var emoString = " ";
emoString = _.rest(emoString.split(' ')).join(' ')
希望这能解决您的问题。
答案 2 :(得分: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));
答案 3 :(得分:0)
我真的很惊讶今天的unicode在浏览器中仍然没有完全支持。我假设其中很多是Windows版本和UTF-16版本。
我相信OP已经找到了他自己的原始问题的解决方案,但我认为必须有一个更通用的解决方案来替代对unicode字符。
无论如何,所以我的解决方案是将文本转换为UTF-32数组,然后使用切片等可以更容易地操作这些数据。
完成对数组的操作后,只需转换回来。
以下是一个例子。
我从中获得的一些代码 - &gt; 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);
答案 4 :(得分:0)
以下答案不使用任何特殊软件包,可以安全删除最后一个表情符号
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??"