C/C++ 開發者習慣使用 <ctype.h> 宏函數 (isalpha, isdigit, isalnum 等) 判斷字元類型。PHP 核心未內建對應函數,但可透過 PECL ctype 擴展 (php_ctype.dll / ctype.so) 獲得相同功能,且參數支援字串 (逐字元檢查全為真才回傳 true)。
; php.ini
extension=ctype ; PHP 5.3+ 通常內建已啟用
; extension=php_ctype.dll ; Windows 早期版本
驗證:php -m | grep ctype 或 phpinfo() 出現 ctype functions enabled。
| C/C++ 宏 | PHP 函數 | 判斷條件 (字串每字元皆符合) |
|---|---|---|
isalnum(c) | ctype_alnum($str) | 字母或數字 [A-Za-z0-9] |
isalpha(c) | ctype_alpha($str) | 字母 [A-Za-z] |
iscntrl(c) | ctype_cntrl($str) | 控制字元 (ASCII 0-31, 127) |
isdigit(c) | ctype_digit($str) | 數字 [0-9] |
isgraph(c) | ctype_graph($str) | 可列印且非空白 (ASCII 33-126) |
islower(c) | ctype_lower($str) | 小寫字母 [a-z] |
isprint(c) | ctype_print($str) | 可列印含空白 (ASCII 32-126) |
ispunct(c) | ctype_punct($str) | 標點符號 (非字數、非空白、非控制) |
isspace(c) | ctype_space($str) | 空白字元 (空格、\t、\n、\r、\v、\f) |
isupper(c) | ctype_upper($str) | 大寫字母 [A-Z] |
isxdigit(c) | ctype_xdigit($str) | 十六進位數字 [0-9A-Fa-f] |
<?php
$str = "123ADAADAD";
if (ctype_alnum($str)) {
echo "只包含英數字元!\n";
}
$input = " hello ";
if (ctype_space($input[0])) { // 單字元檢查
echo "開頭是空白\n";
}
// 實務:驗證純數字 ID
function isValidId($id) {
return ctype_digit((string)$id) && strlen($id) <= 10;
}
| 輸入 | C/C++ isalpha('A') | PHP ctype_alpha("A") | PHP ctype_alpha("AB") |
|---|---|---|---|
| 單字元 | true | true | true |
| 多字元字串 | N/A (需迴圈) | true (全符合) | true (全符合) |
| 空字串 | N/A | false (PHP 5.1+) | false |
| 整數 | 字元碼判斷 | 視為字元碼 (如 65='A') | 參數會被轉為字串 "65" -> false |
陷阱:傳入整數會被當作 ASCII 碼判斷。ctype_digit(123) 檢查字元碼 123 (非數字) -> false。正確用法:ctype_digit((string)$num) 或 ctype_digit("123")。
ctype 函數受 setlocale(LC_CTYPE, ...) 影響。若設定 setlocale(LC_CTYPE, 'zh_TW.UTF-8'),ctype_alpha() 可能將中文字視為字母 (視系統 C 庫實作而定)。**嚴格 ASCII 判斷請勿設定 locale 或改用正則 /^[A-Za-z]+$/。**
preg_match('/^[A-Za-z0-9]+$/', $str) 功能等價 ctype_alnum,更彈活、無 locale 干擾。ctype_* 改進:效能優化、嚴格型別檢查 (傳入非字串/整數拋出 TypeError)。'alpha_num', 'digits' 規則,整合錯誤訊息與國際化。ctype 擴展為 C/C++ 移植開發者提供熟悉的字元判斷 API,且對字串整體判斷語意直觀。現代開發多改用正則或驗證組件,但理解 ctype 行為 (特別是整數參數陷阱與 locale 影響) 仍有助於維護舊代碼與效能敏感場景。