PHP:如何在数组数组上执行htmlspecialchar()?

时间:2010-01-04 22:23:56

标签: php html arrays web-applications

如何在数组对象数组上运行PHP函数htmlspecialchars()

我有以下代码:

$result_set = Array
(
    [0] => Array
        (
            [home_id] => 1
            [address] => 4225 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 76798
        )

    [1] => Array
        (
            [home_id] => 8
            [address] => 4229 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 75093
        )
);

// this doesn't work since $result_set is an array of arrays and htmlspecialchars is expecting a string
htmlspecialchars($result_set, ENT_QUOTES, 'UTF-8')); 

更新

请注意,尽管下面有很多答案,但它们都不适用于数组阵列。以下答案仅适用于简单数组。

我尝试了以下内容,但它不起作用:

array_walk_recursive($result_set, "htmlspecialchars", array(ENT_QUOTES,'UTF-8'))

我收到以下错误:htmlspecialchars() expects parameter 2 to be long, string given


更新2

当我尝试:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
print_r($result_set);
print('-------');
print_r(array_walk_recursive($result_set, "cleanOutput"));

我得到以下,不受欢迎的输出:

Array
(
    [0] => Array
        (
            [home_id] => 1
            [address] => 4225 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 76798
        )
    [1] => Array
        (
            [home_id] => 8
            [address] => 4229 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 75093
        )
)
-------1

更新3

当我尝试:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
$result_set = Array
    (
        [0] => Array
            (
                [home_id] => 1
                [address] => 4225 Nasmyth Dr
                [city] => Plano
                [state] => TX
                [zip] => 76798
            )

        [1] => Array
            (
                [home_id] => 8
                [address] => 4229 Nasmyth Dr
                [city] => Plano
                [state] => TX
                [zip] => 75093
            )
    );

$cleanedOutput = array();
foreach ($result_set as $rs) {
    $cleaned[] = array_map("cleanOutput", $rs);
}
print_r($cleanedOutput);

我得到以下不受欢迎的结果:

{'homes' : []}

10 个答案:

答案 0 :(得分:23)

您可以使用array_map()在每个条目上运行该方法。

$cleaned = array_map("htmlspecialchars", $myArray);

如果您需要将参数传递给htmlspecialchars(),您可以将其替换为您自己的自定义函数:

function myFunc($a) {
  return htmlspecialchars($a, ENT_QUOES);
}

$cleaned = array_map("myFunc", $myArray);

考虑到你正在处理一个数组数组,而不是一个字符串数组,你需要循环遍历外部数组才能找到你的字符串:

$cleaned = array();
foreach ($result_set as $rs) {
  foreach ($rs as $r) {
    $cleaned[] = array_map("htmlspecialchars", $r);
  }
}

或者,您可以使用array_walk_recursive()

array_walk_recursive($myArray, "htmlspecialchars");

请注意,此方法通过引用更改$ myArray对象,因此无需将输出分配给新变量。

答案 1 :(得分:14)

function filter(&$value) {
  $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
array_walk_recursive($result_set, "filter");
print_r($result_set);

答案 2 :(得分:4)

您可能希望使用array_map作为Jonathon Sampson建议,另一种选择是array_walk

不同之处在于array_map返回数组的副本,其中函数应用于每个元素,而array_walk直接在您提供的数组上运行。

答案 3 :(得分:2)

让它适用于多维数组:

function secure($val) {
    return (is_array($val))?array_map('secure',$val):htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
}

它有效,它在没有最后使用数组的数组上调用它自己,如果它不是数组,它将它传递给htmlspecialchars函数。

输入:Array ( [0] => test< [1] => Array ( [test>] => <test?> ) [2] => Array ( [0] => test [1] => > [2] => Array ( [0] => bigtest<> ) ) )

输出:Array ( [0] => test&lt; [1] => Array ( [test>] => &lt;test?&gt; ) [2] => Array ( [0] => test [1] => &gt; [2] => Array ( [0] => bigtest&lt;&gt; ) ) )

答案 4 :(得分:1)

如果要将多个参数传递给回调函数,则无需创建自己的函数。

根据php.net

array array_map ( callback $callback , array $arr1 [, array $... ] )

这意味着如果你想传递多个参数,你应该传递:

$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES, 'UTF-8'));

但由于某些原因,这对我不起作用。

但这似乎确实如此,不要问我为什么。

$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES), array('UTF-8'));

答案 5 :(得分:0)

如果你想使用array_map并传递函数参数,你可以创建自己的函数并将其用作回调函数:

 function cleanhtml($dirtyhtml) {
       return htmlspecialchars($dirtyhtml, UTF-8);
  }

  $cleaned = array_map("cleanhtml", $myArray);

答案 6 :(得分:0)

function htmlspecialchars_array_modify (&$arr){
        array_walk_recursive($arr,function(&$value){
            $value=htmlspecialchars($value);
        });
        return $arr;
    }

//这会改变来源

答案 7 :(得分:0)

此页面上的许多答案要么不够,过时,要么使用array_maparray_walk_recursive的错误参数。这是一个以递归方式修复数组中所有标量值的函数。

htmlspecialchars_recursive()

python3 manage.py makemigrations

python3 manage.py migrate

输出

<?php

function htmlspecialchars_recursive ($input, $flags = ENT_COMPAT | ENT_HTML401, $encoding = 'UTF-8', $double_encode = false) {
    static $flags, $encoding, $double_encode;
    if (is_array($input)) {
        return array_map('htmlspecialchars_recursive', $input);
    }
    else if (is_scalar($input)) {
        return htmlspecialchars($input, $flags, $encoding, $double_encode);
    }
    else {
        return $input;
    }
}

$test = array(
    0 => array(
        'test-1' => 'testing <p>html tag</p> will be fixed',
        'test-2' => '&reg; valid and will be left intact',
        'test-3' =>  '© 2080 kept intact'
    ),
    1 => array(
        'test-4' => array(
            'test-5' => 'deeper fix on <p>html tag</p> test',
            'test-6' => '&reg; will be left intact',
            'test-7' =>  '© 2080 kept intact'
        )
    )
);

print_r(htmlspecialchars_recursive($test));

?>

答案 8 :(得分:0)

验证类功能

function htmlspecialchars_recursive ($input, $flags = ENT_COMPAT | ENT_HTML401, $encoding = 'UTF-8', $double_encode = false) {
    static $flags, $encoding, $double_encode;
    if (is_array($input)) {
        return array_map(array($this, 'htmlspecialchars_recursive'), $input);
    }
    else if (is_scalar($input)) {
        return htmlspecialchars($input, $flags, $encoding, $double_encode);
    }
    else {
        return $input;
    }
}

详细信息:

$ input =您的输入 array()或标量类型,例如整数,浮点数,字符串或布尔值。

$ flags = PHP Available flags constant description here

$ encoding =编码类型默认值:UTF-8

$ double_encode =根据您的需要,可以使用。 TURE或FALSE

函数调用

 //It will convert htmlentities
$param =  $this->htmlspecialchars_recursive($_REQUEST);
// print_r($param);

输出:

/*
        array(
            [whyiitgnq] => &lt;ul&gt;&lt;li&gt;&lt;b&gt;teste&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;i&gt;&lt;u&gt;tets&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;tets&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;test&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;
            [_wysihtml5_mode] => 1
            [aid] => 12695
        )
        */

答案 9 :(得分:0)

这是另一个使用array_walk的通用版本,其行为与htmlspecialchars关于参数的方式相同。

function htmlspecialchars_r($string, 
    int $flags = ENT_COMPAT | ENT_HTML401, 
    string $encoding = null,
    bool $double_encode = true )
{
    if ($encoding === null)
    {
        $encoding =  ini_get("default_charset");
    }

    $filter = function(&$value, $flags, $params) {
        $value = htmlspecialchars($value, $params['flags'], $params['encoding'], $params['double_encode']);
    };

    array_walk_recursive($string, $filter,
        array(
            'flags' => $flags,
            'encoding' => $encoding,
            'double_encode' => $double_encode,
        )
    );

    return $string;
}