周梦康 发表于 2018-05-16 532 次浏览 标签 : unicode

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

老有人发些广告,通过一些浏览器无法解析的编码来绕过正则的匹配。比如下面这个,看来是用空格隔开的,实际里面是有内容的
反垃圾 - 过滤干扰乱码符号
在浏览器中很多不能显示的符号都变为一个了。
比如上面这段文字

上海哪里可以開發票

发这些广告的人通常会用一些符号、数字、无法显示的乱码来干扰我们的反垃圾检测,怎么办呢。

在检测发票等类似的广告时,只要留下文本中的纯中文文字即可。

因为正则可以通过 unicode 做范围匹配,那么我们只要知道中文的 unicode 的范围即可

https://www.unicode.org/charts/unihangridindex.html

CJK Unified Ideographs Extension A (U+3400 through U+4DB5)
CJK Unified Ideographs (U+4E00 through U+9FCC)
CJK Compatibility Ideographs (U+F900 through U+FAD9)
CJK Unified Ideographs Extension B (U+20000 through U+2A6D6)
CJK Unified Ideographs Extension C (U+2A700 through U+2B734)
CJK Unified Ideographs Extension D (U+2B740 through U+2B81D)
CJK Unified Ideographs Extension E (U+2B820 through U+2CEA1)

我们常用的汉字都在U+4E00 ~ U+9FCC区间,但是打开9f 索引可以看到

在9fcc 之前已经两个不可显示的字符。为了防止不良居心的人利用f9c3f9c5

我们直接把4e00 ~ f9c2之外的文字都排除掉,我觉得问题不大,除此之外,还有5个扩展区,都是一些非常生僻的字,而且BCDE都是四字节的汉字。但是那里面词也不会出现在敏感词里面,所以不用考虑了。

就可以通过如下方式来做

$str = "上海哪里可以開發票";

preg_match_all("/[\x{4e00}-\x{9fc2}]/iu", $str, $match);

$str = implode("", $match[0]);

echo $str; // 上海哪里可以開發票

最后就是繁体简体的映射替换了,不是本篇笔记的重点,就不写了。

unicode 和 utf8 的关系,之前也做相关笔记 https://mengkang.net/1129.html
用 php 实现 uft8 字符和 unicode 相互转换 https://mengkang.net/1234.html
更加科普易懂的还得看阮老师的 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表