在PHP 中,數據過濾和驗證是確保應用程序安全性和穩定性的關鍵環節。 PHP 提供了強大的過濾函數集,其中filter_var_array是處理多維數組數據時非常實用的工具。它不僅支持內置的多種過濾器,還允許我們結合自定義過濾函數,實現更精準的複雜數據過濾。
本文將詳細講解如何使用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 。
內置的過濾器滿足大部分需求,但有些複雜數據需要定制邏輯,比如對字符串格式的複雜校驗、跨字段驗證等。
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);
假設有如下複雜數據結構,需要進行如下過濾規則:
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);
}
filter_var_array是處理批量數據過濾的利器。
內置過濾器適合大多數標準數據類型。
通過FILTER_CALLBACK可以結合自定義函數,實現對複雜規則的精準校驗。
結合URL 驗證時,域名部分可使用parse_url進行定制化過濾。
掌握這套技巧,能夠大大提升PHP 應用在接收和處理複雜用戶輸入數據時的安全性和準確性。