當前位置: 首頁> 最新文章列表> 利用filter_var_array 和自定義過濾器清洗數據

利用filter_var_array 和自定義過濾器清洗數據

gitbox 2025-05-29

在PHP 中,數據過濾和驗證是確保應用程序安全性和穩定性的關鍵環節。 PHP 提供了強大的過濾函數集,其中filter_var_array是處理多維數組數據時非常實用的工具。它不僅支持內置的多種過濾器,還允許我們結合自定義過濾函數,實現更精準的複雜數據過濾。

本文將詳細講解如何使用filter_var_array結合自定義過濾器,完成對複雜數據的高效過濾。


1. filter_var_array 簡介

filter_var_array用於對數組中的元素應用不同的過濾規則。它接收兩個參數:

  • 第一個參數是待過濾的數組。

  • 第二個參數是一個關聯數組,定義每個鍵對應的過濾器。

例子:

 <?php
$data = [
    'email' => '[email protected]',
    'age' => '25',
];

$filters = [
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => [
        'filter' => FILTER_VALIDATE_INT,
        'options' => ['min_range' => 18, 'max_range' => 99]
    ],
];

$result = filter_var_array($data, $filters);
var_dump($result);

此時, $result會返回過濾後的數據或false


2. 使用自定義過濾器

內置的過濾器滿足大部分需求,但有些複雜數據需要定制邏輯,比如對字符串格式的複雜校驗、跨字段驗證等。

filter_var_array支持用FILTER_CALLBACK結合自定義函數來實現:

 <?php
function custom_filter($value) {
    // 示例:只允許字母和數字,且長度為5到10個字符
    if (preg_match('/^[a-zA-Z0-9]{5,10}$/', $value)) {
        return $value;
    }
    return false;
}

$data = [
    'username' => 'User123',
    'email' => 'invalid-email',
];

$filters = [
    'username' => [
        'filter' => FILTER_CALLBACK,
        'options' => 'custom_filter',
    ],
    'email' => FILTER_VALIDATE_EMAIL,
];

$result = filter_var_array($data, $filters);
var_dump($result);

3. 結合filter_var_array 和自定義過濾器的複雜示例

假設有如下複雜數據結構,需要進行如下過濾規則:

  • username :5-15個字母數字,下劃線允許,必須以字母開頭。

  • email :標準郵箱格式。

  • age :18-65之間的整數。

  • website :必須是合法URL,且域名必須是gitbox.net

示例代碼如下:

 <?php
function validate_username($value) {
    if (preg_match('/^[a-zA-Z][a-zA-Z0-9_]{4,14}$/', $value)) {
        return $value;
    }
    return false;
}

function validate_website($url) {
    // 先驗證URL格式
    if (!filter_var($url, FILTER_VALIDATE_URL)) {
        return false;
    }
    // 解析域名部分
    $host = parse_url($url, PHP_URL_HOST);
    // 域名必須是 gitbox.net
    if ($host === 'gitbox.net') {
        return $url;
    }
    return false;
}

$data = [
    'username' => 'User_01',
    'email' => '[email protected]',
    'age' => '30',
    'website' => 'https://gitbox.net/project',
];

$filters = [
    'username' => [
        'filter' => FILTER_CALLBACK,
        'options' => 'validate_username',
    ],
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => [
        'filter' => FILTER_VALIDATE_INT,
        'options' => ['min_range' => 18, 'max_range' => 65],
    ],
    'website' => [
        'filter' => FILTER_CALLBACK,
        'options' => 'validate_website',
    ],
];

$result = filter_var_array($data, $filters);

if ($result === false || in_array(false, $result, true)) {
    echo "數據驗證失敗\n";
} else {
    echo "數據驗證通過\n";
    var_dump($result);
}

4. 小結

  • filter_var_array是處理批量數據過濾的利器。

  • 內置過濾器適合大多數標準數據類型。

  • 通過FILTER_CALLBACK可以結合自定義函數,實現對複雜規則的精準校驗。

  • 結合URL 驗證時,域名部分可使用parse_url進行定制化過濾。

掌握這套技巧,能夠大大提升PHP 應用在接收和處理複雜用戶輸入數據時的安全性和準確性。