我需要有关如何检测输入是否包含日语表情符号/表情符号的帮助。 目前我正在构建一个charset = utf-8的系统。在输入文本上,用户可以输入日文字符/ alpanumerics /符号,但如果他们插入表情符号,onsubmit javascript将检查是否有表情符号,将显示错误信息。真的不知道如何检测表情符号。
答案 0 :(得分:20)
您可以使用以下正则表达式:
/(?:[\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\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\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, '');
}
答案 1 :(得分:12)
答案可能有效,但很糟糕,因为它们依赖于难以理解且有点“神奇”的unicode范围,因为并不总是清楚它们来自何处以及它们为什么起作用,更不用说它们对新的表情符号没有弹性被添加到规范中。
主要的浏览器现在支持unicode property escape,该功能允许根据其在Emoji
unicode类别中的归属来匹配表情符号:\p{Emoji}
匹配表情符号,\P{Emoji}
匹配非表情符号
请注意,officially,0123456789#*
和其他字符也是表情符号,因此您可能要使用的属性转义符不是Emoji
而是Extended_Pictographic
,它表示所有通常被理解为表情符号的字符!
请确保在末尾添加the u
flag。
console.log(
/\p{Emoji}/u.test('flowers'), // false :)
/\p{Emoji}/u.test('flowers ???'), // true :)
/\p{Emoji}/u.test('flowers 123'), // true :(
)
console.log(
/\p{Extended_Pictographic}/u.test('flowers'), // false :)
/\p{Extended_Pictographic}/u.test('flowers ???'), // true :)
/\p{Extended_Pictographic}/u.test('flowers 123'), // false :)
)
答案 2 :(得分:9)
我们可以检测特定范围内的所有代理对或表情符号字符列表。 如果问题与将输入字符串存储到5.5之前的MySQL版本数据库有关,我们需要使用以下正则表达式检测并删除所有代理对
/([\uD800-\uDBFF][\uDC00-\uDFFF])/g.
答案 3 :(得分:6)
简单函数,如果您的字符串包含一个或多个表情符号,则返回true。
function isEmoji(str) {
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
];
if (str.match(ranges.join('|'))) {
return true;
} else {
return false;
}
}
答案 4 :(得分:6)
您可以使用此库emoji-regex
中的正则表达式答案 5 :(得分:4)
您可以使用正则表达式在输入文本中检测它:
/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g
答案 6 :(得分:0)
像波纹管一样检查表情符号
function getEmojiChars(text) {
console.log(text.match(/\ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f]|\ud83d[\ude80-\udeff]/g)) ;
}
您将在文本中获得表情符号数组
答案 7 :(得分:0)
我编写了以下函数:containsEmojis(input, includeBasic=true)
,该函数根据Unicode规范版本13中定义的表情符号列表(请参阅https://unicode.org/Public/emoji/13.0/emoji-sequences.txt)检查表情符号的输入字符串,并允许忽略“基本” “只能用3个字节表示的表情符号。
下面的代码段定义了该函数并运行一些测试用例:
/**
* iterates over the code points of an input string and returns true if an emoji is found.
*
* an emoji is found if the hex code for the character is 5 characters starting with "1F",
* or if @includeBasic is true, the character is 4 and starts with one of the prefixes of
* a basic emoji as defined in the Unicode specification version 13
* see https://unicode.org/Public/emoji/13.0/emoji-sequences.txt
*
* @input the string to check
* @includeBasic include also the basic emojis that only take 3 characters
*/
function containsEmojis(input, includeBasic) {
if (typeof includeBasic == "undefined")
includeBasic = true;
for (var c of input) {
var cHex = ("" + c).codePointAt(0).toString(16);
var lHex = cHex.length;
if (lHex > 3) {
var prefix = cHex.substring(0, 2);
if (lHex == 5 && prefix == "1f") {
return true;
}
if (includeBasic && lHex == 4) {
if (["20", "21", "23", "24", "25", "26", "27", "2B", "29", "30", "32"].indexOf(prefix) > -1)
return true;
}
}
}
return false;
}
// can be tested as follows:
var input;
input = "Hello World!";
console.log(input, containsEmojis(input));
input = "Hello ?!";
console.log(input, containsEmojis(input));
console.log(input, containsEmojis(input, false));
// now try a basic emoji
input = "It sparkles ✨ yay!";
console.log(input, containsEmojis(input));
// pass false for includeBasic
console.log(input, containsEmojis(input, false));
答案 8 :(得分:0)
2020年更新:这些模式中的许多模式与复合表情符号或修饰符序列不正确匹配,或者只是过时且与较新的表情符号不匹配。
考虑这对接吻的情侣:??❤️???。实际上,还有6个(也许更多)其他表情符号与ZWJ零宽度连接符粘合在一起。要正确匹配,必须实际匹配该序列。
因此,通过首先匹配较长的序列,这种强力模式(时间太长,太粘贴了,但这是一个简单的替代方法,运行速度很快),可以正确解析2020年10月之前的所有3250个左右的表情符号:
GitHub链接:https://github.com/sweaver2112/Regex-combined-emojis
演示的输入字符串包括所有来自
的字符