首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sanitize &去属性多维数组

Sanitize &去属性多维数组
EN

Stack Overflow用户
提问于 2015-05-26 10:31:42
回答 2查看 1.5K关注 0票数 1

我有以下课程,我写道:

代码语言:javascript
复制
class Sanitizer {

    public function sanitizeSingle ($string) {  
        if (get_magic_quotes_gpc()) {
            $string = stripslashes($string);
        }

        return trim(htmlspecialchars($string, ENT_QUOTES)); 
    }

    public function sanitize ($string) {
        if (is_array($string)) {
            foreach ($string as $k => $v) {
                $string[$k] = $this->sanitizeSingle($v);
            }
        }
        else {
            $string = $this->sanitizeSingle($string);
        }

        return $string;
    }

    public function desanitize ($string) {
        return trim(htmlspecialchars_decode($string, ENT_QUOTES));
    }

}

问题是,当它在字符串和一维数组上工作时,我在多维数组中得到以下错误:

警告: htmlspecialchars()希望参数1是字符串,在第10行的C:\wamp\www\classes\Sanitizer.php中给出数组

我该怎么解决这个问题?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-26 10:45:58

您的代码在$v中没有对数组进行评估,而是像这样修改您的foreach块,这种修改将净化任何级别的嵌套数组,

代码语言:javascript
复制
 foreach ($string as $k => $v) {
        if(is_array($v))
        {
            $string[$k] = $this->sanitize($v);
        }
        else
        {
            $string[$k] = $this->sanitizeSingle($v);
        }
 }
票数 3
EN

Stack Overflow用户

发布于 2019-11-30 13:42:10

只要进行一些小的调整,您就可以利用本机递归函数在数组中的任何级别对标量值进行清理。

代码语言:javascript
复制
array_walk_recursive($data, [$this, 'sanitizeSingle']);

代码:(演示)

代码语言:javascript
复制
class Sanitizer {
    public function sanitizeSingle(&$string) {  
        if (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) {
            $string = stripslashes($string);
        }
        $string = trim(htmlspecialchars($string, ENT_QUOTES)); 
    }

    public function sanitize($data) {
        if (is_array($data)) {
            array_walk_recursive($data, [$this, 'sanitizeSingle']);  // replace your loop with this line
        } else {
            $this->sanitizeSingle($data);
        }
        return $data;
    }
}

$array = ['one' => ['a ', ' b ', ' c'], 'two' => " <a href='test'>Test</a>"];
$string = ' another "test"';

$sanitizer = new Sanitizer();
var_export($sanitizer->sanitize($array));
echo "\n---\n";
var_export($sanitizer->sanitize($string));

输出:

代码语言:javascript
复制
array (
  'one' => 
  array (
    0 => 'a',
    1 => 'b',
    2 => 'c',
  ),
  'two' => '&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;',
)
---
'another &quot;test&quot;'

sanitizeSingle()通过引用修改输入字符串,以便对变量声明任何调整,并且没有return值。

sanitize()不通过引用进行修改;修改后的数据是return编辑的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30455995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档