| 類型 | 常量前綴 | 用途 |
| 驗證 | FILTER_VALIDATE_* | 判斷數據是否符合格式,**不修改**原值 |
| 清理 | FILTER_SANITIZE_* | 格式化數據,**移除/替換**不合法字符,返回處理後的值 |
查看所有可用過濾器
$filter) {
echo "$filter (ID: " . filter_id($filter) . ")\n";
}
/* 輸出示例:
int (257)
boolean (258)
float (259)
validate_regexp (272)
validate_url (273)
validate_email (274)
validate_ip (275)
string / stripped (513)
encoded (514)
special_chars (515)
unsafe_raw (516)
email (517)
url (518)
number_int (519)
number_float (520)
magic_quotes (521)
full_special_chars (522)
callback (1024)
*/
核心函數
filter_var($value, $filter, $options):單值驗證/清理;
filter_var_array($data, $filters):批量處理關聯數組;
filter_input($type, $name, $filter, $options):直接獲取並過濾超全局變量(INPUT_GET/POST/COOKIE/SERVER/ENV);
filter_input_array($type, $filters):批量獲取並過濾。
常用驗證器詳解
1. 整數
$age = 25;
filter_var($age, FILTER_VALIDATE_INT); // 25
filter_var('abc', FILTER_VALIDATE_INT); // false
// 範圍驗證
filter_var(42, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]); // false
filter_var(25, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18]]); // 25
// 八/十六進制
filter_var('0xFF', FILTER_VALIDATE_INT, ['flags' => FILTER_FLAG_ALLOW_HEX]); // 255
filter_var('077', FILTER_VALIDATE_INT, ['flags' => FILTER_FLAG_ALLOW_OCTAL]); // 63
2. 浮點數
filter_var(3.14, FILTER_VALIDATE_FLOAT); // 3.14
filter_var('3,14', FILTER_VALIDATE_FLOAT, ['options' => ['decimal' => ',']]); // 3.14 (德語格式)
// 數組批量
$arr = ['1.2', 'abc', '3.4'];
filter_var_array($arr, FILTER_VALIDATE_FLOAT); // [1.2, false, 3.4]
3. 布爾值
$trueVals = ['1', 'true', 'on', 'yes', 1, true];
$falseVals = ['0', 'false', 'off', 'no', '', 0, false, null];
foreach ($trueVals as $v) var_dump(filter_var($v, FILTER_VALIDATE_BOOLEAN)); // true
foreach ($falseVals as $v) var_dump(filter_var($v, FILTER_VALIDATE_BOOLEAN)); // false
// 嚴格模式:僅接受 true/false/1/0
filter_var('yes', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); // null
4. URL
filter_var('https://example.com', FILTER_VALIDATE_URL); // 通過
filter_var('example.com', FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED); // false (無協議)
filter_var('https://example.com/path', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED); // 通過
filter_var('https://example.com?a=1', FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED); // 通過
5. Email
filter_var('user@example.com', FILTER_VALIDATE_EMAIL); // 通過
filter_var('invalid@', FILTER_VALIDATE_EMAIL); // false
// 注意:僅做基本格式檢查,不驗證域名 MX 記錄
6. IP 地址
filter_var('192.168.1.1', FILTER_VALIDATE_IP); // 通過
filter_var('2001:db8::1', FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); // 通過
filter_var('192.168.1.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // false (私有 IP)
filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); // false (保留 IP)
7. 正則驗證
filter_var('abc123', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^[a-z]+\\d+$/i']]); // 通過
8. 回調過濾器(自定義邏輯)
function sanitizeUsername($v) {
return strtolower(trim(preg_replace('/[^a-z0-9_]/i', '', $v)));
}
filter_var(' AbC_123!@# ', FILTER_CALLBACK, ['options' => 'sanitizeUsername']); // 'abc_123'
清理過濾器
// 字符串清理:移除標簽、編碼特殊字符
$html = 'Bold';
filter_var($html, FILTER_SANITIZE_STRING); // 'alert(1)Bold' (移除標簽)
filter_var($html, FILTER_SANITIZE_FULL_SPECIAL_CHARS); // '<script>alert(1)</script><b>Bold</b>'
// Email 清理:移除非法字符
filter_var('user@exa mple.com', FILTER_SANITIZE_EMAIL); // 'user@example.com'
// URL 清理
filter_var('https://exa mple.com', FILTER_SANITIZE_URL); // 'https://example.com'
// 數字清理
filter_var('1,234.56', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); // '1234.56'
filter_var('abc123', FILTER_SANITIZE_NUMBER_INT); // '123'
批量處理表單數據
$filters = [
'username' => FILTER_SANITIZE_STRING,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]],
'email' => FILTER_VALIDATE_EMAIL,
'website' => FILTER_VALIDATE_URL,
'bio' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
];
$clean = filter_input_array(INPUT_POST, $filters);
// $clean 包含驗證/清理後的值,失敗項為 false/null
if ($clean['age'] === false) {
// 年齡驗證失敗
}
最佳實踐
- 輸入端驗證:控制器層使用
filter_input_array 統一清理所有輸入;
- 業務邏輯驗證:模型層使用
filter_var 做嚴格格式校驗;
- 輸出端編碼:模板層使用
htmlspecialchars / FILTER_SANITIZE_FULL_SPECIAL_CHARS 防 XSS;
- 不要過度依賴:複雜業務規則(如密碼強度、身份證校驗)仍需自定義函數或驗證庫(Respect/Validation, Symfony Validator)。
- 上一篇文章: Grunt LiveReload 實現頁面自動刷新的兩種方案詳解
- 下一篇文章: PHP 實現搜索引擎爬蟲日誌記錄系統
Copyright ©
程式碼之家 All Rights Reserved