Ctype 擴展自 PHP 4.2 內建,提供一組「單一字串參數、回傳布林值」的字元分類函數,底層直接呼叫 C 標準庫 ctype.h,效能遠超正則表達式,且語義清晰、零依賴。適用於表單驗證、資料清洗、協議解析等高頻場景。
| 函數 | 檢測內容 | 等效正則 |
|---|---|---|
ctype_alnum() | 僅含字母數字 | /^[A-Za-z0-9]+$/ |
ctype_alpha() | 僅含字母 | /^[A-Za-z]+$/ |
ctype_cntrl() | 僅含控制字元 (\n\r\t 等) | /^[\x00-\x1F\x7F]+$/ |
ctype_digit() | 僅含數字 0-9 | /^[0-9]+$/ |
ctype_graph() | 僅含可列印非空白字元 | /^[\x21-\x7E]+$/ |
ctype_lower() | 全小寫字母 | /^[a-z]+$/ |
ctype_print() | 僅含可列印字元(含空白) | /^[\x20-\x7E]+$/ |
ctype_punct() | 僅含標點符號(非字母數字空白) | /^[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$/ |
ctype_space() | 僅含空白字元 | /^[\s]+$/ |
ctype_upper() | 全大寫字母 | /^[A-Z]+$/ |
ctype_xdigit() | 僅含十六進位字元 | /^[0-9A-Fa-f]+$/ |
<?php
$str = "0.1123";
var_dump(ctype_digit($str)); // false(含小數點)
var_dump(is_numeric($str)); // true(科學計數法、負號、十六進位皆視為數字)
記住:ctype_digit 嚴格限定「純數字字元」,is_numeric 語義更寬鬆。
<?php
function validate_username($input) {
// 僅允許字母數字,長度 3-16
return ctype_alnum($input) && strlen($input) >= 3 && strlen($input) <= 16;
}
function validate_hex_color($input) {
// #RRGGBB 或 RRGGBB
$color = ltrim($input, '#');
return strlen($color) === 6 && ctype_xdigit($color);
}
function validate_no_control_chars($input) {
// 防止注入控制字元導致日誌偽造、終端顯示異常
return !ctype_cntrl($input);
}
ctype_digit():~0.08 秒preg_match('/^\d+$/'):~0.45 秒is_numeric():~0.12 秒Ctype 系列函數無正則編譯開銷、無回溯風險,極適合高併發入口的輸入前置過濾。
'' 均回傳 false,需額外判斷 strlen($str) > 0。TypeError (PHP 8+) 或自動轉字串 (PHP 7),建議統一 (string)$val。mb_check_encoding() + 正則或 \p{Han}。善用 Ctype,能讓驗證代碼更簡潔、執行更快、維護更易,是 PHP 開發者「去正則化」的首選工具箱。