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的问题,如果各位大神有什么好的方法,希望能不吝赐教,谢谢啦!