正则匹配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 过滤
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Unicode编码来匹配emoji字符。每个emoji字符都有一个唯一的Unicode编码,可以在正则表达式中使用。以下是一个示例代码,演示如何使用Java正则表达式匹配emoji字符: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class EmojiMatcher { public static void main(String[] args) { String text = "This is a string with an emoji: \uD83D\uDC4D"; Pattern pattern = Pattern.compile("[\\x{1F000}-\\x{1F6FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{1F900}-\\x{1F9FF}\\x{1F300}-\\x{1F5FF}\\x{1F680}-\\x{1F6FF}\\x{1F1E0}-\\x{1F1FF}\\x{1F191}-\\x{1F251}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{1F300}-\\x{1F5FF}\\x{1F900}-\\x{1F9FF}\\x{1F1E6}-\\x{1F1FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F918}-\\x{1F9FF}\\x{1F910}-\\x{1F917}\\x{1F980}-\\x{1F984}\\x{1F9C0}]"); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("Found emoji: " + matcher.group()); } } } ``` 该代码使用了Unicode编码范围来匹配emoji字符。其中,`\x{1F000}-\x{1F6FF}`表示基本的emoji字符,`\x{2600}-\x{26FF}`和`\x{2700}-\x{27BF}`表示其他符号和图形,`\x{1F900}-\x{1F9FF}`表示补充符号和象形文字,`\x{1F300}-\x{1F5FF}`表示其他符号和象形文字,`\x{1F680}-\x{1F6FF}`表示交通和地图符号,`\x{1F1E0}-\x{1F1FF}`表示国旗,`\x{1F191}-\x{1F251}`表示其他符号(箭头、星号等),`\x{1F600}-\x{1F64F}`表示表情符号,`\x{1F1E6}-\x{1F1FF}`表示国家地区旗帜,`\x{1F918}-\x{1F9FF}`表示人物和身体部位,`\x{1F910}-\x{1F917}`表示表情符号,`\x{1F980}-\x{1F984}`表示食品和饮料,`\x{1F9C0}`表示物品。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值