在这个网站中可以查看所有的emoji unicode
:Emoji Unicode table
用js代码找出这个页面所有emoji unicode
的范围:
let $list = document.querySelectorAll('.category')
for(let key in $list){
let text = $list[key].innerText? $list[key].innerText.replace(/(Back to top)|(\n?)/ig,'') :'';
console.log(text)
}
输出结果:
1. Emoticons ( 1F601 - 1F64F )
2. Dingbats ( 2702 - 27B0 )
3. Transport and map symbols ( 1F680 - 1F6C0 )
4. Enclosed characters ( 24C2 - 1F251 )
5. Uncategorized
6a. Additional emoticons ( 1F600 - 1F636 )
6b. Additional transport and map symbols ( 1F681 - 1F6C5 )
6c. Other additional symbols ( 1F30D - 1F567 )
ES6 新增的 Unicode 字符表示法:将码位放入大括号,就能正确解读该字符 例如 :
\u{1F601}
得到了emoji unicode 就学要把unicode的范围拼接起来生成正则表达式:
let $list = document.querySelectorAll('.category')
let arr = [],regText = '',result;
for(let key in $list){
let text = $list[key].innerText?$list[key].innerText.replace(/(Back to top)|(\n?)/ig,'') :'';
result = text.match(/\(\s+([0-9a-fA-F]+)\s+-\s+([a-fA-F0-9]+)\s+\)/)
if(result && result.length == 3){
regText += `\\u{${result[1]}}-\\u{${result[2]}}`
}
arr.push(text)
}
reg = new RegExp('['+regText+']','gu')
console.log(reg);///[\u{1F601}-\u{1F64F}\u{2702}-\u{27B0}\u{1F680}-\u{1F6C0}\u{24C2}-\u{1F251}\u{1F600}-\u{1F636}\u{1F681}-\u{1F6C5}\u{1F30D}-\u{1F567}]/gu
经过测试:\u{24C2}-\x{1F251}
这里要改为\u{1F170}-\u{1F251}
最后得到的JS正则是:
/[\u{1F601}-\u{1F64F}\u{2702}-\u{27B0}\u{1F680}-\u{1F6C0}\u{1F170}-\u{1F251}\u{1F600}-\u{1F636}\u{1F681}-\u{1F6C5}\u{1F30D}-\u{1F567}]/gu
可以使用在线正则表达式验证一下
js emoji 工具
let $list = document.querySelectorAll('.category')
let arr = [],regText = '',result;
for(let key in $list){
let text = $list[key].innerText?$list[key].innerText.replace(/(Back to top)|(\n?)/ig,'') :'';
result = text.match(/\(\s+([0-9a-fA-F]+)\s+-\s+([a-fA-F0-9]+)\s+\)/)
if(result && result.length == 3){
regText += `\\x{${result[1]}}-\\x{${result[2]}}|`
}
arr.push(text)
}
console.log('php 正则表达式')
console.log('/['+regText+']/u' );///[\x{1F601}-\x{1F64F}\x{2702}-\x{27B0}\x{1F680}-\x{1F6C0}\x{24C2}-\x{1F251}\x{1F600}-\x{1F636}\x{1F681}-\x{1F6C5}\x{1F30D}-\x{1F567}]/u
经过测试:\x{1F170}-\x{1F251}
这里要改为
所以一般emoji匹配的正则是:
/[\x{1F601}-\x{1F64F}\x{2702}-\x{27B0}\x{1F680}-\x{1F6C0}\x{1F170}-\x{1F251}\x{1F600}-\x{1F636}\x{1F681}-\x{1F6C5}\x{1F30D}-\x{1F567}]/u
function removeEmoji($nickname) {
$clean_text = "";
$regexEmoticons = '/[\x{1F601}-\x{1F64F}\x{2702}-\x{27B0}\x{1F680}-\x{1F6C0}\x{24C2}-\x{1F251}\x{1F600}-\x{1F636}\x{1F681}-\x{1F6C5}\x{1F30D}-\x{1F567}]/u';
$clean_text = preg_replace($regexEmoticons, '', $text);
return $clean_text;
}
echo removeEmoji('你好')
这篇文章里写的一个PHP处理微信昵称emoji方法
function filterEmoji($str)
{
$str = preg_replace_callback( '/./u',
function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
},
$str);
return $str;
}
php 在线编辑器
已上方法得出的emoji unicode 的范围,只符号大多数常见的符号,并还是不全面。可以看一下这个php emoji 库