正则匹配emoji字符

寻找emoji的编码范围

在这个网站中可以查看所有的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}

JS emoji符号匹配

得到了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 工具

php 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

php 过滤emoji字符方法:

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 库

参考

  1. Emoji 的处理 - 使用正则表达式匹配所有 Emoji
  2. PHP处理微信昵称emoji方法
  3. Emoji的编码以及常见问题处理
  4. JS Emoji 过滤
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页