![](/img/trans.png)
[英]How can I remove the remaining \u200d aflter removing emoji with the RegExp in 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.