PHP需要修剪所有的$_POST变量。

14

我需要在一个不寻常的情况下向您求助。我需要修剪所有的 $_POST 变量。

有没有一种方法可以一次完成,即使用单个函数?

我知道 trim($_POST) 不起作用,我必须创建某些函数,例如:

function sanatize_post(){
    foreach ($_POST as $key => $val)
        $_POST[$key] = trim($val);
}

但是,如果你有任何其他建议或评论,请帮助我。

谢谢


如果你正在编写一个库或框架,那么你应该提供比 trim 更多的功能。否则,对于单个页面或特定项目,你不应该盲目地处理整个 $_POST。你应该知道确切需要从 $_POST[] 中获取哪些值,并仅获取这些值,然后按其特定方式分别处理每个值(例如,某个值可能是数字;将其转换为整数或浮点数比仅修剪空格更好)。 - axiac
@axiac - 有没有任何情况,盲目地将 trim 应用于所有 post 值会导致一些不良副作用?我的意思是,假设您“知道”您不想保留任何字段两端的空格。 - ToolmakerSteve
8个回答

16
简单易懂。
  $_POST = array_map("trim", $_POST);

但如果$_POST成员(即使只有其中之一)本身又是一个数组,则使用递归版本:

    function array_map_deep( $value, $callback ) 
    {
        if ( is_array( $value ) ) {
            foreach ( $value as $index => $item ) {
                    $value[ $index ] = array_map_deep( $item, $callback );
            }
        } elseif ( is_object( $value ) ) {
            $object_vars = get_object_vars( $value );
            foreach ( $object_vars as $property_name => $property_value ) {
                    $value->$property_name = array_map_deep( $property_value, $callback );
            }
        } else {
            $value = call_user_func( $callback, $value );
        }
        return $value;
    }

15

这里有一个一行代码,它可以适用于单个值或递归地作用于数组:

$_POST = filter_var($_POST, \FILTER_CALLBACK, ['options' => 'trim']);

在 FILTER_CALLBACK 之前加上反斜杠有什么意义吗? - Leon
1
@Leon 请参考 https://dev59.com/kG445IYBdhLWcg3wl7TW - Mike

10

使用自定义函数和array_walk函数。

$clean_values = array();
array_walk($_POST, 'sanitize_post');

function sanitize_post($item, $key)
{
    $clean_values[$key] = trim($item);
    //optional further cleaning ex) htmlentities
}

2
使用 array_walk_recursive 而不是 array_walk 可以涵盖表单中字段分组的情况。 - Adam
@brian_d 在这个答案中,您编写了一个接受参数 $tem 和 $key 的自定义函数,请问它们是如何传递给函数的? - Swapnil Shende

8

array_walk($_POST, 'trim') (请注意,这个方法和想法可能是错误的,因为输入名称= foo [bar] 会被转换成数组)

编辑:上面的不正确。尝试使用$_POST = array_map('trim', $_POST);.


2
还有它的递归版本 http://php.net/manual/zh/function.array-walk-recursive.php - nikc.org
请问你能解释一下“(注意,这个想法可能会有问题,因为输入名称为foo[bar]的情况会被转换成数组)”是什么意思吗? - I-M-JM
这个解决方案不可行,因为 trim 将会在每个数组元素上被调用,但是数组元素本身并不会改变。你需要编写一个自定义函数,类似于:function custom(&$a){ $a= trim($a);} - Adam

2
如果您想使用一个函数来清理字符串或数组,可以使用我编写的以下代码:

function sanitize ($value) {
    // sanitize array or string values
    if (is_array($value)) {
        array_walk_recursive($value, 'sanitize_value');
    }
    else {
        sanitize_value($value);
    }

    return $value;
}

function sanitize_value (&$value) {
    $value = trim(htmlspecialchars($value));
}

只需要像这样使用:

$post_sanitized = sanitize($_POST);
$apple_sanitized = sanitize('apple');

1

我认为最好使用匿名函数:

array_walk($_POST, function(& $value){
    $value = trim($value);
});

1
简单地使用这个:

array_walk($_POST, create_function('&$val', '$val = trim($val);')); 

而且你的 $_POST 现在被修剪过了。


1
其他答案无法很好地处理关联数组。这个递归函数将修剪 $_POST 数组中所有级别的值。
// Trim all values of associative array
function trim_associative_array(&$input_array) {
    if (is_array($input_array)) {
        foreach ($input_array as $key => &$val) {
            if (is_array($val)) {
                trim_associative_array($val);
            } else {
                $input_array[$key] = trim($val);
            }
        }
    }
}

1
我喜欢明确地看到递归 - 这样我就知道代码确切地在做什么。然而,对于任何来到这里的人,另一种选择是使用 array_walk_recursive - 将其替换为上面使用 array_walk 的答案之一。或者递归应用 array_map,这样你就不必自己编写递归了。 - ToolmakerSteve

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