学习PHP中有趣的字符集国际化验证功能
今天的内容非常简单,不过也很有趣。不知道大家有没有经历过这样的事情,就是在某些字体下,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中有趣的字符集国际化验证功能的更多相关文章
- (译) 在AngularJS中使用的表单验证功能【转】
验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...
- (译) 在AngularJS中使用的表单验证功能
验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...
- 学习PHP中的国际化功能来查看货币及日期信息
做为一门在世界范围内广泛使用的编程语言,国际化能力往往是衡量一个编程语言是否能够大范围流行的重要内容.特别是对于 PHP 这种以 Web 页面编程为主战场的语言来说,国际化能力更是重中之重.在 PHP ...
- 学习PHP中的国际化日期格式化操作
对于国际化功能来说,日期相关的格式化操作也是一块重头戏,毕竟不同的时区,不同的国家对于日期的表示方式都会有些不同.今天我们主要来学习的就是国际化地表示日期相关的信息内容. 日期格式化 首先就是最直接的 ...
- 学习PHP中国际化地数字格式处理
不知道大家有没有了解过,对于数字格式来说,西方国家会以三位为一个进位,使用逗号来分隔.比如,12345678,用标准的格式来表示的话就是 12,345,678 .不过我们中文其实并不会有这样的分隔符, ...
- Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用
1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...
- [学习]sentinel中的DatatSource(二) WritableDataSource
sentinel是今年阿里开源的高可用防护的流量管理框架. git地址:https://github.com/alibaba/Sentinel wiki:https://github.com/alib ...
- EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充
EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
随机推荐
- Python断言及常用断言函数总结
Python断言 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 As ...
- Java工具类-输入输出流
输入输出流 1.概念 输入输出流:文件复制,上传 输出流: System.out.println() 写操作,程序将字符流写入到"目的地",比如打印机和文件等 输入流 :Scann ...
- Activity与Service生命周期
一. Activity 先展示一张Activity的生命周期图: 1.1 Activity状态 只有下面三个状态是静态的,可以存在较长的时间内保持状态不变.(其它状态只是过渡状态,系统快速执行并切换到 ...
- 【XSS-labs】level 6-10
Level 6 查看源码:对URL中的传参进行了HTML实体化转义,搜索框中的值对 src\onxxxxx\data\href进行了限制. 采用大小写绕过,在搜索框输入payload,注意闭合inpu ...
- SQL 练习2
查询同时存在" 01 "课程和" 02 "课程的情况 分析:分别先查询出包含有01课程和02课程 SELECT * from sc WHERE cid='01' ...
- luogu P6239 奇怪的道路
奇怪的道路 我看不出来是状压的状压 好吧,其实看到k的范围应该去往状压方面想的. 然后,题目中说"任何一个城市都与恰好偶数条道路相连(0也被认为是偶数)". 所以,奇偶,两种状态可 ...
- NOIP 模拟 $31\; \rm Game$
题解 很容易求出在没有字典序最大的限制条件下的最多胜利场数. 这样就可以对于每一位放最优的解,怎么做,二分答案. 分两种情况,一种是当前一位是输的,一种是赢的,复杂度 \(\mathcal O(\rm ...
- C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁
参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008 C#中的几种锁:用户模式锁.内核模式锁.动态计数.监视锁介绍 ...
- Linux centos 安装 Node.js
官网下载地址 https://nodejs.org/zh-cn/download/ 1.下载二进制文件 (x64) 相当于 https://nodejs.org/dist/v10.16.3/no ...
- 从新建文件夹开始构建ShadowPlay Engine(5)
本篇序言 从本篇开始,我们要开始构建引擎核心中的系统组件部分,广义上讲其实我们从开始到现在一直都是在构建引擎核心中的系统部分,但严格的定义中系统组件大概有这么几个:内存管理,线程管理,文件管理,时间系 ...