使用PHP filter_input_array过滤多维POST数据

3

你能否用PHP的filter_input_array过滤/清洗多维POST数据?

假设有一个表单,结果为以下POST数据:

$_POST[
    'level1a' => [
        'level2a' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ],
        'level2b' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ],
    'level1b' => [
        'level2a' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ],
        'level2b' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ]
]

我没有看到一种方法可以告诉filter_input_array函数要检查的数据嵌套在更深的一层。似乎只有标志FILTER_REQUIRE_ARRAY,但无法告知需要检查哪个级别。

较少维度的工作示例:

如果只是一个较少嵌套的数据集,那就很简单:

$_POST[
    'level1a' => [
        'level2a' => 'value1',
        'level2b' => 'value2'
    ],
    'level1b' => [
        'level2a' => 'value1',
        'level2b' => 'value2'
    ]
]

可以通过以下方式进行过滤:

$args = array(
    'level1a' => array(
        'filter' => FILTER_SANITIZE_STRING, 
        'flags' => FILTER_REQUIRE_ARRAY
    ),
    'level1b' => array(
        'filter' => FILTER_SANITIZE_STRING, 
        'flags' => FILTER_REQUIRE_ARRAY
    )
);
$form_data = filter_input_array(INPUT_POST, $args);

但是如何处理更多的嵌套数据呢?是否有一种方法可以在不分割/展平POST数据的情况下解决问题?


1
你可以很容易地编写一个递归函数来运行filter_input_array在一些数据上,然后递归到内部数组。 - shevron
我现在正在处理一个类似的问题。我会告诉你我想到了什么。 - Anthony Rutledge
我可能会尝试设计我的HTML表单,使其仅创建标量和/或二维数组。由于$_POSTINPUT_POST不同,将$_POST展平将不会对INPUT_POST产生任何影响。从纯粹的意义上讲,我认为您应该将$_POST排除在外。我的建议是,如果可能的话,请展平您的HTML表单,而不是输入源数组。是的,可以使用一些技巧,但代价是什么?处理时间?维护?文档?一旦超出两个维度,PHP就会让你自己摸索了。 :) 注意,没有INPUT_FILES - Anthony Rutledge
1
你可以尝试这个答案中的第二个想法:https://dev59.com/QlTTa4cB1Zd3GeqPrVEJ#4995863 - A.J.
1个回答

4
/**
* Trim and filter every value in the nested array
*/
function filter(array &$array)
{
    array_walk_recursive($array, function (&$value) {
         $value = filter_var(trim($value), FILTER_SANITIZE_STRING);
    });

    return $array;
}

/**
* Get filtered POST data
*/
function post(){
  return filter($_POST);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接