今天的内容非常简单,不过也很有趣。不知道大家有没有经历过这样的事情,就是在某些字体下,0 和 O 不好区分,1 和 l 也是很难看清楚。当然,现在大部分的编辑器和 IDE 的默认字体都是会选择那些比较好区分这些相似字符的,比如给 0 中间加上个斜杠或者一个点之类的。在 PHP 中也有这样的函数能够帮助我们来检查是否有这样的不好区分的字符存在。

类似字符检测

$checker = new Spoofchecker();

var_dump($checker->areConfusable('google.com', 'goog1e.com')); // true

var_dump($checker->areConfusable('google.com', 'g00g1e.com')); // false

Spoofchecker 类就是用来进行这类检测的类,它的 areConfusable() 方法就能够帮助我们检测两个字符串中是否有相似的字符。比如我们第一个测试代码中,l 和 1 ,如果不仔细看还真有可能认错。第二段检测代码返回的 false ,说明不存在非常相似的字符,但如果我们将第一个字符串中的小写的 o 换成大写的 O 的话,这段也会返回 true 。大家可以自己测试一下。

可疑字符检测

另外,我们可以使用 Spoofchecker 类的另一个方法来检测字符串中是否有可疑的字符。

var_dump($checker->isSuspicious('google.com')); // FALSE

var_dump($checker->isSuspicious('Рaypal.com')); // TRUE

为什么 Paypal.com 会返回 true 呢?它哪里可疑了?

其实 isSuspicious() 检测是字符串中的各个字符是否来自不同的 Unicode 字符。大写的 P 是有可能来自于 Cyrylic 这个 Unicode 字符集中,不一定是拉丁字符的那个 P 。当然,这方面的知识做为中国人的我们并不是太了解,除了专门学外语专业或者学习过字母源头相关知识的朋友可能会比较清楚。

不同区域语言中的效果

既然是国际化的类和方法,那么如果我们修改区域语言,检测的结果会有不同吗?


$checker->setAllowedLocales('zh_CN'); var_dump($checker->areConfusable('google.com', 'goog1e.com')); // true var_dump($checker->areConfusable('google.com', 'g00g1e.com')); // false var_dump($checker->isSuspicious('google.com')); // TRUE var_dump($checker->isSuspicious('Рaypal.com')); // TRUE

使用 Spoofchecker 的 setAllowedLocales() 方法可以为 Spoofchecker 的操作设置当前的区域语言信息。在设置为中文后,isSuspicious() 返回的内容都是 TRUE 了,毕竟采用的字符集不同了,都不会走默认的拉丁字符集了。

总结

好吧,这篇文章真的只是为了有趣。在实际的业务中,如果我们要做一些文章、代码校验的功能,或许 areConfusable() 能够为我们提供一些便利。大家还是以了解的态度试着玩玩吧!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/9.学习PHP中有趣的字符集国际化验证功能.php

参考文档:

https://www.php.net/manual/zh/class.spoofchecker.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

学习PHP中有趣的字符集国际化验证功能的更多相关文章

  1. (译) 在AngularJS中使用的表单验证功能【转】

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  2. (译) 在AngularJS中使用的表单验证功能

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  3. 学习PHP中的国际化功能来查看货币及日期信息

    做为一门在世界范围内广泛使用的编程语言,国际化能力往往是衡量一个编程语言是否能够大范围流行的重要内容.特别是对于 PHP 这种以 Web 页面编程为主战场的语言来说,国际化能力更是重中之重.在 PHP ...

  4. 学习PHP中的国际化日期格式化操作

    对于国际化功能来说,日期相关的格式化操作也是一块重头戏,毕竟不同的时区,不同的国家对于日期的表示方式都会有些不同.今天我们主要来学习的就是国际化地表示日期相关的信息内容. 日期格式化 首先就是最直接的 ...

  5. 学习PHP中国际化地数字格式处理

    不知道大家有没有了解过,对于数字格式来说,西方国家会以三位为一个进位,使用逗号来分隔.比如,12345678,用标准的格式来表示的话就是 12,345,678 .不过我们中文其实并不会有这样的分隔符, ...

  6. Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用

    1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...

  7. [学习]sentinel中的DatatSource(二) WritableDataSource

    sentinel是今年阿里开源的高可用防护的流量管理框架. git地址:https://github.com/alibaba/Sentinel wiki:https://github.com/alib ...

  8. EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充

    EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...

  9. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

随机推荐

  1. FIFO 深度了解

    嘻哈第二篇,深度聊聊各种细节. 优化与跨时钟阈分析

  2. 003 PCI Express体系结构(三)

    一.PCI总线的存储器读写总线事务 总线的基本任务是实现数据传送,将一组数据从一个设备传送到另一个设备,当然总线也可以将一个设备的数据广播到多个设备.在处理器系统中,这些数据传送都要依赖一定的规则,P ...

  3. 微软官方安装介质Windows10系统安装教程

    微软官方安装介质Windows10系统安装教程 Jasper游戏 发布时间:04-2204:23 小贴士:事前准备 ★ 拥有 Internet 连接 ★ 在计算机.USB 或外部驱动器上拥有足够的可用 ...

  4. Qt 中的属性系统(Property System)

    21 人赞同了该文章 本节内容主要讲解我对 Qt 属性系统的理解.官方文档参考 The Property System. 如何理解"属性系统"这个概念? 一般我们说一个类有什么属性 ...

  5. Qt中子窗口关闭之后,立即释放资源的方法

    用Qt做界面的时候,很多时候都会遇见点击一个按钮弹出一个新的窗口的功能.我在刚开始做这个功能的时候,直接是点击一次按钮就new一个新的窗口,每次都只是将子窗口关闭而已,并没有去释放子窗口的资源,这样就 ...

  6. Map 综述(四):彻头彻尾理解 HashTable

    摘要: Hashtable与HashMap都是Map族中较为常用的实现,也都是Java Collection Framework 的重要成员,它们的本质都是 链表数组.本文深入JDK源码并从定义.构造 ...

  7. django1.9和mysql

    修改setting.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',#使用mysql 'NAME': 'jiank ...

  8. 解决 conda tensorflow failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED

    参考解决方案1:https://stackoverflow.com/questions/38303974/tensorflow-running-error-with-cublas 参考解决方案2:ht ...

  9. python matplotlib 绘图+显示数值

    参考:https://www.jb51.net/article/152685.htm 用plt.text函数 import numpy as np import matplotlib.mlab as ...

  10. excel快捷键如下:

    ALT+ 空格键,然后按下 X ALT+ 空格键,然后按下 R  首先打开表格,在A1对角用鼠标左键单击,界面会全部选中,然后调整字体大小框里的数字,回车,表格就变大了. 同时按Alt和E,再按L   ...