學習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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章