早期 PHP 開發者習慣用正則表達式驗證 Email、URL、IP 位址等格式,但正則難寫、難維護,且容易遺漏邊界案例。其實 PHP 5.2+ 內建的 filter_var() 搭配 FILTER_VALIDATE_* 系列常數,已能涵蓋大多數常見驗證需求,程式碼更簡潔、可讀性更高。
$email = 'jb51@qq.com';
$result = filter_var($email, FILTER_VALIDATE_EMAIL);
var_dump($result); // string(14) "jb51@qq.com" 通過則回傳原值,失敗回傳 false
$url = "https://www.jb51.net";
$result = filter_var($url, FILTER_VALIDATE_URL);
var_dump($result); // string(22) "https://www.jb51.net"
$ipv4 = "192.168.1.110";
$result = filter_var($ipv4, FILTER_VALIDATE_IP);
var_dump($result); // string(13) "192.168.1.110"
$ipv6 = "2001:DB8:2de::e13";
$result = filter_var($ipv6, FILTER_VALIDATE_IP);
var_dump($result); // string(17) "2001:DB8:2de::e13"
FILTER_VALIDATE_INT 可搭配 options 參數指定 min_range、max_range:
$i = '010';
$result = filter_var(
$i,
FILTER_VALIDATE_INT,
array('options' => array('min_range' => 1, 'max_range' => 100))
);
var_dump($result); // bool(false) 因為 010 被視為八進位 8,不在 1~100 範圍內
// 對比:若直接用比較運算子,PHP 弱型別會將 '010' 轉為 10,導致誤判
$i = '010';
$result = $i >= 1 && $i <= 100;
var_dump($result); // bool(true) —— 這就是為何要用 filter_var 的原因
$float = 12.312;
$result = filter_var($float, FILTER_VALIDATE_FLOAT);
var_dump($result); // float(12.312)
FILTER_VALIDATE_EMAIL 預設不支援國際化網域名稱(IDN),若需支援可先用 idn_to_ascii() 轉碼再驗證。FILTER_VALIDATE_URL 預設要求包含 scheme(如 https://),若需允許無 scheme 的網址,可加上 FILTER_FLAG_SCHEME_REQUIRED、FILTER_FLAG_HOST_REQUIRED 等旗標組合控制。false,方便統一錯誤處理。善用內建過濾器,不只能減少正則錯誤,也能讓程式碼更符合現代 PHP 最佳實踐。