本篇文章更新時間:2023/04/11
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
這需求真是時不時會碰到,在問 ChatGPT 的時候,他直接寫一個範例:
function containsThai($str) {
return preg_match('/\p{Thai}+/u', $str);
}
// 測試
if (containsThai("สวัสดีชาวโลก")) {
echo "這包含泰文";
} else {
echo "這不包含泰文";
}
其中 {Thai} 這邊可以看得出來是一個關鍵字代表了「泰文」。
往下追問想看看還可以判斷哪些語言,就提到可以從這個 PHP 官方文件 Unicode character properties 中找到對應的關鍵字來判斷。
常見的 Unicode 屬性名稱:
\p{Greek}:比對希臘字母字符\p{Cyrillic}:比對斯拉夫語系中的字符,包括俄文、白俄羅斯文、保加利亞文、塞爾維亞語等\p{Arabic}:比對阿拉伯字母字符\p{Hebrew}:比對希伯來字母字符\p{Han}:比對漢字字符\p{Katakana}:比對片假名字符\p{Hiragana}:比對平假名字符\p{Thai}:比對泰文字符
然後請他把整張表都幫我註解,看到底有哪些語言文字的判斷屬性:
Arabic:阿拉伯文字符Armenian:亞美尼亞文字符Bengali:孟加拉文字符Bopomofo:注音符號字符Braille:點字字符Buhid:布希德文字符Canadian_Aboriginal:加拿大原住民字符Carian:卡里亞文字符Cham:占族文字符Cherokee:切羅基文字符Common:普通字符(不帶語言屬性)Coptic:科普特文字符Cuneiform:楔形文字字符Cypriot:塞浦路斯文字符Cyrillic:西里爾文字符Deseret:德薩雷特字符Devanagari:天城文字符Egyptian_Hieroglyphs:埃及象形文字字符Ethiopic:衣索比亞文字符Georgian:喬治亞文字符Glagolitic:格拉哥里文字符Gothic:哥德文字符Greek:希臘文字符Gujarati:古吉拉特文字符Gurmukhi:古木基文字符Han:漢字字符Hangul:韓文字符Hanunoo:哈努諾文字符Hebrew:希伯來文字符Hiragana:平假名字符Imperial_Aramaic:帝國阿拉米文字符Inherited:繼承字符Inscriptional_Pahlavi:碑銘巴列維文字符Inscriptional_Parthian:碑銘帕提亞文字符Javanese:爪哇文字符Kaithi:凱蒂文字符Kannada:卡納達文字符Katakana:片假名字符Kayah_Li:克耶字母字符Kharoshthi:卡羅須提文字符Khmer:高棉文字符Lao:寮文字符Latin:拉丁文字符Lepcha:勒巴文字符Limbu:林布文字符Linear_B:線性 B 文字符Lisu:麗僳文字符Lycian:利基亞文字符Lydian:印歐語系古代語言Mahjong:麻將牌符號Malayalam:馬來文字符Mandaic:曼代文字符Meetei_Mayek:米蒂-瑪雅克文字符Meroitic_Cursive:體系瑪若字母文字符Meroitic_Hieroglyphs:瑪若象形文字字符Miao:苗文字符Mongolian:蒙古文字符Myanmar:緬甸文字符New_Tai_Lue:新傣文字符Nko:N'Ko 字母字符Ogham:奧格姆文字符Ol_Chiki:桑塔利文字符Old_Italic:古意大利文字符Old_Persian:古波斯文字符Old_South_Arabian:古南阿拉伯文字符Old_Turkic:古突厥文字符Oriya:奧里亞文字符Osmanya:奧斯曼亞文字符Phags_Pa:八思巴文字符Phoenician:腓尼基文字符Rejang:瑞讓文字符Runic:古北歐文字符Samaritan:撒瑪利亞文字符Saurashtra:索拉什特拉文字符Sharada:莎拉達文字符Shavian:蕭伯納文字符Sinhala:僧伽羅文字符Sora_Sompeng:索拉桑彭文字符Sundanese:巽他文字符Syloti_Nagri:錫爾赫特-那格里文字符Syriac:敘利亞文字符Tagalog:塔加路文字符Tagbanwa:塔格巴努亞文字符Tai_Le:傣仂文字符Tai_Tham:傣南文字符Tai_Viet:傣北文字符Takri:塔克里文字符Tamil:泰米爾文字符Telugu:泰盧固文字符Thaana:塔安那文字符Thai:泰文字符Tibetan:藏文字符Tifinagh:提非納文字符Ugaritic:烏加里特文字符Vai:瓦伊文字符Yi:彝文字符
這邊筆記一下,以後要比對哪個語言文字的時候,自己替換一下就好了!
反過來說,如果想知道一個字串裡,有包含哪些語言的文字,可以使用下列方法:
function detect_unicode_charset($str, $charsets) {
// 定義各個字符集的正則表達式
$regex = array(
'Arabic' => '/\p{Arabic}/u',
'Bengali' => '/\p{Bengali}/u',
'Chinese' => '/\p{Han}/u',
'Cyrillic' => '/\p{Cyrillic}/u',
'Devanagari' => '/\p{Devanagari}/u',
'Georgian' => '/\p{Georgian}/u',
'Greek' => '/\p{Greek}/u',
'Gujarati' => '/\p{Gujarati}/u',
'Gurmukhi' => '/\p{Gurmukhi}/u',
'Hebrew' => '/\p{Hebrew}/u',
'Hiragana' => '/\p{Hiragana}/u',
'Kannada' => '/\p{Kannada}/u',
'Katakana' => '/\p{Katakana}/u',
'Khmer' => '/\p{Khmer}/u',
'Korean' => '/\p{Hangul}/u',
'Lao' => '/\p{Lao}/u',
'Latin' => '/\p{Latin}/u',
'Malayalam' => '/\p{Malayalam}/u',
'Myanmar' => '/\p{Myanmar}/u',
'Oriya' => '/\p{Oriya}/u',
'Sinhala' => '/\p{Sinhala}/u',
'Tamil' => '/\p{Tamil}/u',
'Telugu' => '/\p{Telugu}/u',
'Thai' => '/\p{Thai}/u',
);
// 遍歷字符集並查找相符的字符
$matches = array();
foreach ($charsets as $charset) {
if (isset($regex[$charset]) && preg_match($regex[$charset], $str)) {
$matches[] = $charset;
}
}
return $matches;
}
// 使用範例
$str = "Hello こんにちは สวัสดี مرحبا привет नमस्ते ನಮಸ್ಕಾರ హలో";
$charsets = array('Chinese', 'Japanese', 'Thai', 'Hindi', 'Russian');
$result = detect_unicode_charset($str, $charsets);
print_r($result); // 輸出: Array('Chinese', 'Japanese', 'Thai', 'Hindi', 'Russian')
沒有按照前段全部列出來,但就是可以自己依樣畫葫蘆補充。
