本篇文章更新時間: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')
沒有按照前段全部列出來,但就是可以自己依樣畫葫蘆補充。