javascript过滤emoji

虽然标题是“过滤”emoji,但其实并不只是除去了emoji。

写在开头(str='你需要过滤的字符串')

1、根据业务需求,输入的内容只有中文,英文和常用符号,那么只需要将不符合这几个条件的字符去掉就行

  过滤代码:var reg = /[^\u4e00-\u9fa5|\u0000-\u00ff|\u3002|\uFF1F|\uFF01|\uff0c|\u3001|\uff1b|\uff1a|\u3008-\u300f|\u2018|\u2019|\u201c|\u201d|\uff08|\uff09|\u2014|\u2026|\u2013|\uff0e]/g;

      str = str.replace(reg,'');

 

2、有的数据库因为设置的是utf8的编码,导致如果你插入的数据中如果有4个字节的emoji表情(其实不止emoji表情),插入数据失败;

     这样前台无法成功提交内容不说,还看到你返回的一串错误代码提示(尴尬。。。。),在不修改数据库编码情况下,可以用下面的

     代码过滤掉4个字节的字符(这个并不会将emoji都过滤掉,但是数据库插入操作不会报错)

    过滤代码:str = str.replace(/([\ud800-\udbff][\u0000-\uffff])/g,'')

 

3、根据网上查的资料得出的大范围扑杀过滤代码,这个方法当时没发现漏网之鱼,中文也不会被过滤掉;(后来发现有中文的全角符号被

     过滤掉了。。。。慎用

    过滤代码: str = unescape(escape(str).replace(/\%uD.{3}|\%u2.{3}|\%uf.{3}|\%A9|\%AE/ig,''))

 

  一开始想先将emoji的编码范围查出来,再过滤掉的。然而。。。这emoji的编码范围一直在变大,而且范围也不是连续的,这表示你无法

涵盖所有的emoji编码,除非你不停的更新你的过滤代码。

  方法3中后面的'%A9'和'%AE'就是后来发现的’漏网之鱼‘,而这也表示并不是所有的emoji表情都是4个字节;

 

  如果业务需求和方法1比较相似,要注意,普遍的中文字符编码范围[\u4e00-\u9fa5]并不包括一些全角的中文符号,比如:'《',

  所以在过滤的时候要将这些全角的编码范围加上,下面是网上找到的中文全角符号的编码:

  

名称  Unicode 符号                     名称  Unicode 符号

句号    3002  。                  引号    201C  “ 

问号    FF1F  ?                                  201D  ” 

叹号       FF01  !                 括号    FF08  ( 

                                                                      FF09  ) 

逗号    FF0C  ,                       括号    3014  〔  

顿号    3001  、                                 3015  〕  

分号    FF1B  ;                  括号    3010  【  

冒号    FF1A  :                                 3011  】  

 

引号    300C  「                 破折号      2014  —  

      300D  」                 省略号      2026  …   

引号    300E  『                 连接号      2013  –   

      300F  』                 间隔号      FF0E  .  

引号    2018  ‘                   书名号      300A  《  

      2019  ’                                     300B  》  

                                                     书名号      3008  〈   

                                                                     3009  〉

 

  如果是针对方法2的情况,只是为了插入数据库的时候不报错,那么只需要处理掉4个字节的字符就可以了,当然如果输入的emoji符号不是

4个字节的,那么当然就不会过滤掉;相反的有些非emoji的4个字符的文字或者符号也会被过滤掉,而这包括了一些生僻的中文;

从某搜索引擎上搜索到的中文unicode编码范围:

可以发现,有些字符的范围已经超过了2个字节的范围,而你输入这些字符,也一样会导致数据库插入操作失败;

但是我发现,这些字实在生僻,连输入法里面都没有,一般用户根本不会输入这些文字(不排除一些存心来搞事的家伙 T_T)

 

这里分享一个github地址(https://github.com/iamcal/js-emoji/blob/master/lib/emoji.js),这个项目是帮助我们在设备上输出emoji的,

但是我们可以在这里比较全面的看到emoji的编码范围,大部分都集中在\ud83c[\udc00-\udfff]和\ud83d[\udc00-\udfff],还有一些零散在

\u2.{3}和\u3.{3}上;

 

 这些方法其实都没能完美的解决过滤emoji的问题,如果各位大神有什么好的方法,希望能不吝赐教,谢谢啦!

 

转载于:https://www.cnblogs.com/kable/p/6426829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值