首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP filter 函數數據驗證與過濾完整指南

     編輯:PHP 綜合知識

兩大類過濾器

查看所有可用過濾器

 $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) {
    // 年齡驗證失敗
}

最佳實踐

  1. 輸入端驗證:控制器層使用 filter_input_array 統一清理所有輸入;
  2. 業務邏輯驗證:模型層使用 filter_var 做嚴格格式校驗;
  3. 輸出端編碼:模板層使用 htmlspecialchars / FILTER_SANITIZE_FULL_SPECIAL_CHARS 防 XSS;
  4. 不要過度依賴:複雜業務規則(如密碼強度、身份證校驗)仍需自定義函數或驗證庫(Respect/Validation, Symfony Validator)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型常量前綴用途
驗證FILTER_VALIDATE_*判斷數據是否符合格式,**不修改**原值
清理FILTER_SANITIZE_*格式化數據,**移除/替換**不合法字符,返回處理後的值