今天的內容非常簡單,不過也很有趣,不知道大家有沒有經歷過這樣的事情,就是在某些字體下,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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295997.html
標籤:PHP
