如何使用JavaScript删除表情符号代码?我认为我已经使用下面的代码解决了这个问题,但我仍然有像 这样的字符。
function removeInvalidChars() {
return this.replace(/[\uE000-\uF8FF]/g, '');
}
如何使用JavaScript删除表情符号代码?我认为我已经使用下面的代码解决了这个问题,但我仍然有像 这样的字符。
function removeInvalidChars() {
return this.replace(/[\uE000-\uF8FF]/g, '');
}
对我来说,没有一个答案完全可以去除所有的表情符号,所以我不得不自己动手解决,这就是我得到的:
text.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, '');
同时,需要考虑到如果将该字符串插入数据库后,用空字符串替换可能会导致安全问题。建议使用替换字符U+FFFD进行替换。详情请参见:http://www.unicode.org/reports/tr36/#Deletion_of_Noncharacters
[\u2694-\u2697]
扩展到 [\u2580-\u27BF]
,以包括一些其他的形状和饰品,这样就可以匹配常见的 ❤️ 字符 (\u2764\uFE0F
)。我还将 \uD83E[\uDD10-\uDD5D]
扩展到 \uD83E[\uDD10-\uDDFF]
,以捕捉一些表情符号,如,,,,和。 - Caleb Miller/[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2580-\u27BF]|\uD83E[\uDD10-\uDDFF]/g
。 - Caleb Miller\g
之前添加|
,它也会处理任何空格。如果有人需要:/[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2580-\u27BF]|\uD83E[\uDD10-\uDDFF]| /g
- PRO[\U0001F300-\U0001F5FF]
来检测这些字符,但JavaScript的RegExp
不支持这样的操作。不幸的是,JS字符串模型是基于UTF-16码元构建的,因此您需要在正则表达式中使用UTF-16代理。return this.replace(/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g, '')
需要注意的是,基本多语言平面中还有其他一些字符被手机用作表情符号,但这些字符在表情符号出现之前就存在了。例如,U+2665是传统的红心花色字符♥,但在某些设备上它可能被呈现为表情符号图形。你可以选择将其视为表情符号并尝试将其删除。请参见此列表以获取更多示例。
我使用正则表达式和Unicode属性转义来解决了它。我从这篇文章中得到的,虽然是针对Java的,但仍然非常有用 - 从Java字符串中删除表情符号。
'Smile'.replace(/[^\p{L}\p{N}\p{P}\p{Z}^$\n]/gu, '');
它会删除除以下符号外的所有符号:
这个方法更加正确,也能起作用,但是对于我来说会在字符串中留下一些垃圾符号:
'Smile'.replace(/\p{Emoji}/gu, '');
编辑:添加了评论中的符号^
和 $
。 应该是 /[^\p{L}\p{N}\p{P}\p{Z}{\^\$}]/gu
。 - avalanche1/\p{Emoji}/gu
,它会移除数字。 "Test123"
变成了 "Test"
。 - vozaldi我找到了很多建议,但解决我的问题的正则表达式是:
/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g
一个简短的例子
function removeEmojis (string) {
var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
return string.replace(regex, '');
}
希望它能够帮助你
仅是对 @hababr 回答的补充。
如果您需要去除复杂的表情符号,您还必须删除诸如修饰符等其他内容:
''.replace(/[\p{Emoji}\p{Emoji_Modifier}\p{Emoji_Component}\p{Emoji_Modifier_Base}\p{Emoji_Presentation}]/gu, '').charCodeAt(0)
更新:
*#0-9
- 是带有默认文本表示的表情符号,符合 Unicode 标准。
因此,我的当前解决方案如下:
''.replace(/(?![*#0-9]+)[\p{Emoji}\p{Emoji_Modifier}\p{Emoji_Component}\p{Emoji_Modifier_Base}\p{Emoji_Presentation}]/gu, '').charCodeAt(0)
@bobince的解决方法对我没起作用,要么表情符号还在原地,要么被其他表情符号替换了。
这个解决方法对我很有帮助:
var ranges = [
'\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF
'\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F
'\ud83d[\ude80-\udeff]' // U+1F680 to U+1F6FF
];
$('#mybtn').on('click', function() {
removeInvalidChars();
})
function removeInvalidChars() {
var str = $('#myinput').val();
str = str.replace(new RegExp(ranges.join('|'), 'g'), '');
$("#myinput").val(str);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myinput"/>
<input type="submit" id="mybtn" value="clear"/>
我知道这篇文章有点旧,但我在工作中遇到了这个问题,我的同事提出了一个有趣的想法。基本上,不要剥离表情符号字符,只允许有效的字符存在。可以参考这个 ASCII 表:
像下面这样的函数只会保留合法字符(范围取决于你所需要的内容)。
function (input) {
var result = '';
if (input.length == 0)
return input;
for (var indexOfInput = 0, lengthOfInput = input.length; indexOfInput < lengthOfInput; indexOfInput++) {
var charAtSpecificIndex = input[indexOfInput].charCodeAt(0);
if ((32 <= charAtSpecificIndex) && (charAtSpecificIndex <= 126)) {
result += input[indexOfInput];
}
}
return result;
};
在搜索和尝试了许多Unicode正则表达式后,我建议您尝试这个,它可以涵盖所有的表情符号:
function removeEmoji(str) {
let strCopy = str;
const emojiKeycapRegex = /[\u0023-\u0039]\ufe0f?\u20e3/g;
const emojiRegex = /\p{Extended_Pictographic}/gu;
const emojiComponentRegex = /\p{Emoji_Component}/gu;
if (emojiKeycapRegex.test(strCopy)) {
strCopy = strCopy.replace(emojiKeycapRegex, '');
}
if (emojiRegex.test(strCopy)) {
strCopy = strCopy.replace(emojiRegex, '');
}
if (emojiComponentRegex.test(strCopy)) {
// eslint-disable-next-line no-restricted-syntax
for (const emoji of (strCopy.match(emojiComponentRegex) || [])) {
if (/[\d|*|#]/.test(emoji)) {
continue;
}
strCopy = strCopy.replace(emoji, '');
}
}
return strCopy;
}
let a = "1️⃣aa♂️b#️⃣✅❎23#!^*bb♀️ccc";
console.log(removeEmoji(a))
这里的所有答案都不能处理我测试过的所有Unicode字符(特别是杂项范围内的字符,例如⛽或☯️)。
以下是适用于我个人情况的一种方法,灵感(很大程度上)来自这个PHP SO答案:
function _removeEmojis(str) {
return str.replace(/([#0-9]\u20E3)|[\xA9\xAE\u203C\u2047-\u2049\u2122\u2139\u3030\u303D\u3297\u3299][\uFE00-\uFEFF]?|[\u2190-\u21FF][\uFE00-\uFEFF]?|[\u2300-\u23FF][\uFE00-\uFEFF]?|[\u2460-\u24FF][\uFE00-\uFEFF]?|[\u25A0-\u25FF][\uFE00-\uFEFF]?|[\u2600-\u27BF][\uFE00-\uFEFF]?|[\u2900-\u297F][\uFE00-\uFEFF]?|[\u2B00-\u2BF0][\uFE00-\uFEFF]?|(?:\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDEFF])[\uFE00-\uFEFF]?/g, '');
}
.trim()
以去除空格。 - rickchristiesandre89的回答很好但并不完美。 我花了一些时间研究这个主题并找到了一个可行的解决方案。
var ranges = [
'[\u00A0-\u269f]',
'[\u26A0-\u329f]',
// The following characters could not be minified correctly
// if specifed with the ES6 syntax \u{1F400}
'[-]'
//'[\u{1F004}-\u{1F9C0}]'
];
$('#mybtn').on('click', function() {
removeInvalidChars();
});
function removeInvalidChars() {
var str = $('#myinput').val();
str = str.replace(new RegExp(ranges.join('|'), 'ug'), '');
$("#myinput").val(str);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myinput" />
<input type="submit" id="mybtn" value="clear" />
这是我的 CodePen。
但需要注意以下几点:
从 U+1F000
开始的 Unicode 字符需要特殊注释,你可以使用 sandre89 的方式,或者选择 ES6 标准中的 \u{1F000}
注释方式,但后者可能无法与你的代码压缩器兼容。我成功地将表情图案直接粘贴到了 UTF-8 编码脚本中。
不要忘记正则表达式中的 u
标志,否则你的 JavaScript 引擎可能会报错。
由于文件编码、字符集或代码压缩器等问题,一些操作可能无法正常工作。在我的情况下,除非我将脚本从一个 .isml
文件(Demandware)中取出并粘贴到一个 .js
文件中,否则什么都不起作用。
你可以参考维基百科上的 Emoji 页面和 一个 Unicode 字符占用多少字节?,还可以使用我使用过的 在线 Unicode 转换器。