PHP Filter 擴展提供統一、簡便的方式驗證與過濾來自不安全來源的資料(如表單輸入、Cookie、Web Service 回應、伺服器變數、資料庫查詢結果)。PHP 5.2 起內建核心,無需安裝。
| 函數 | 說明 | PHP 版本 |
|---|---|---|
filter_var() | 過濾單一變數 | 5 |
filter_var_array() | 批次過濾多個變數 | 5 |
filter_input() | 取得並過濾單一輸入變數 (GET/POST/COOKIE 等) | 5 |
filter_input_array() | 批次取得並過濾多個輸入變數 | 5 |
filter_list() | 取得所有支援的過濾器清單 | 5 |
filter_id() | 取得指定過濾器的 ID 號 | 5 |
filter_has_var() | 檢查指定輸入類型的變數是否存在 | 5 |
false| 過濾器 ID | 說明 |
|---|---|
| FILTER_VALIDATE_INT | 驗證整數 (可加 min_range/max_range 選項) |
| FILTER_VALIDATE_BOOLEAN | 驗證布林值 ("1","true","on","yes" → true) |
| FILTER_VALIDATE_FLOAT | 驗證浮點數 |
| FILTER_VALIDATE_REGEXP | 依 PCRE 正則驗證 |
| FILTER_VALIDATE_URL | 驗證 URL (可加 FILTER_FLAG_QUERY_REQUIRED 等旗標) |
| FILTER_VALIDATE_EMAIL | 驗證 Email 格式 |
| FILTER_VALIDATE_IP | 驗證 IP (可限 IPv4/IPv6/非私有/非保留) |
| FILTER_SANITIZE_STRING | 移除標籤,編碼/移除特殊字元 |
| FILTER_SANITIZE_STRIPPED | STRING 別名 |
| FILTER_SANITIZE_ENCODED | URL-encode 字串,移除/編碼特殊字元 |
| FILTER_SANITIZE_SPECIAL_CHARS | HTML 轉義 '"<>& 及 ASCII < 32 字元 |
| FILTER_SANITIZE_EMAIL | 只保留字母數字及 !#$%&'*+-/=?^_`{|}~@.[] |
| FILTER_SANITIZE_URL | 只保留字母數字及 $-_.+!*'(),{}|\^~[]`<>#%";/?:@&= |
| FILTER_SANITIZE_NUMBER_INT | 只保留數字與 +- |
| FILTER_SANITIZE_NUMBER_FLOAT | 只保留數字、+-、.、eE |
| FILTER_SANITIZE_MAGIC_QUOTES | 套用 addslashes() |
| FILTER_UNSAFE_RAW | 不處理,可配合旗標編碼特殊字元 |
| FILTER_CALLBACK | 呼叫使用者自定函數進行過濾 |
透過關聯陣列 ['options' => [...], 'flags' => ...] 傳遞額外設定。例如:
<?php
$opts = [
'options' => ['min_range' => 1, 'max_range' => 120],
'flags' => FILTER_FLAG_ALLOW_OCTAL
];
filter_var($age, FILTER_VALIDATE_INT, $opts);
?>
<?php
$filters = [
'name' => FILTER_SANITIZE_STRING,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]],
'email' => FILTER_VALIDATE_EMAIL,
];
$result = filter_input_array(INPUT_POST, $filters);
if (!$result['age']) {
echo "年齡必須在 1~120 之間";
} elseif (!$result['email']) {
echo "Email 格式錯誤";
} else {
echo "資料驗證通過";
}
?>
<?php
function underscore_to_dot($str) {
return str_replace('_', '.', $str);
}
$input = 'www_example_com';
echo filter_var($input, FILTER_CALLBACK, ['options' => 'underscore_to_dot']);
// 輸出: www.example.com
?>
<?php
$ip = '2001:0db8:85a3::8a2e:0370:7334';
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
echo "合法的 IPv6 位址";
}
?>
htmlspecialchars() 或模板引擎自動逃逸,而非單靠 FILTER_SANITIZE_SPECIAL_CHARS。