PHP:对象上的递归htmlspecialchars

标签 php json object recursion

我想为来自各种来源的数据建立一个通用的 sanitizer 程序。清理我的意思是(在这个阶段)将 htmlspecialchars 应用于字符串。现在,来自这些来源的数据可以是任何东西,从对象到数组再到字符串,都是嵌套的(而且很复杂),而且格式总是有点不同。

所以我想到了一个递归的 htmlspecialchars 函数,它将自身应用于数组和对象,并且只将 htmlspecialchars 应用于字符串,但是我如何递归地遍历一个对象呢?

谢谢。

编辑:我想我应该提到这一点——我实际上正在构建一个严重依赖 JS 和 JSON 进行客户端-服务器通信的 RIA。服务器唯一要做的就是从数据库中获取内容并通过 JSON 将其返回给客户端,格式如下:

{"stat":"ok","data":{...}}

正如我所说,数据可以是任何东西,不仅来自数据库的字符串形式,还可以来自 XML 处理JSON的工作流程如下:

  1. 从 DB/XML 中获取数据(源编码为 iso-8859-1)
  2. 将它们放入“数据”数组

  3. 使用递归方式将 iso-8859-1 转换为 utf-8

    private function utf8_encode_deep(&$input) {
    if (is_string($input)) {
        $input = $this -> str_encode_utf8($input);
    } else if (is_array($input)) {
        foreach ($input as &$value) {
            $this -> utf8_encode_deep($value);
        }
    
        unset($value);
    } else if (is_object($input)) {
        $vars = array_keys(get_object_vars($input));
    
        foreach ($vars as $var) {
            $this -> utf8_encode_deep($input -> $var);
        }
    }
    }
    
  4. 使用PHP的json_encode将数据转成JSON

  5. 向客户端发送(回显)数据

  6. 使用 JS 呈现数据(例如放入表格)

在这两者之间的某个地方,数据应该以某种方式被净化(在这个阶段只有 htmlspecialchars)。现在的问题应该是:在哪里 sanitizer ,使用什么方法?

最佳答案

你可以试试下面的方法

class MyClass {
    public $var1 = '<b>value 1</b>';
    public $var2 = '<b>value 2</b>';
    public $var3 = array('<b>value 3</b>');
}

$list = array();
$list[0]['nice'] = range("A", "C");
$list[0]['bad'] = array("<div>A</div>","<div>B</div>","<div>C</div>",new MyClass());
$list["<b>gloo</b>"] = array(new MyClass(),"<b>WOW</b>");

var_dump(__htmlspecialchars($list));

使用的函数

function __htmlspecialchars($data) {
    if (is_array($data)) {
        foreach ( $data as $key => $value ) {
            $data[htmlspecialchars($key)] = __htmlspecialchars($value);
        }
    } else if (is_object($data)) {
        $values = get_class_vars(get_class($data));
        foreach ( $values as $key => $value ) {
            $data->{htmlspecialchars($key)} = __htmlspecialchars($value);
        }
    } else {
        $data = htmlspecialchars($data);
    }
    return $data;
}

输出类似

array
  0 => 
    array
      'nice' => 
        array
          0 => string 'A' (length=1)
          1 => string 'B' (length=1)
          2 => string 'C' (length=1)
      'bad' => 
        array
          0 => string '&lt;div&gt;A&lt;/div&gt;' (length=24)
          1 => string '&lt;div&gt;B&lt;/div&gt;' (length=24)
          2 => string '&lt;div&gt;C&lt;/div&gt;' (length=24)
          3 => 
            object(MyClass)[1]
              ...


    array
      0 => 
        object(MyClass)[2]
          public 'var1' => string '&lt;b&gt;value 1&lt;/b&gt;' (length=26)
          public 'var2' => string '&lt;b&gt;value 2&lt;/b&gt;' (length=26)
          public 'var3' => 
            array
              ...

关于PHP:对象上的递归htmlspecialchars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713702/

相关文章:

php - 如何将Asterisk服务器与外部关系数据库(例如mysql)集成?

PHP将组合插入到mysql

arrays - Swift:无法将项目附加到具有两个值的数组

javascript - Object.defineProperty - 防止用户更改此 JavaScript

java - 处理从 Java 到 PHP 再到 MySQL 的字符编码

PHP URL 重定向 - 我这样做对吗?

javascript - 年份作为索引

json - Circe 和 Scala 的枚举类型

java - 获取 JSON 响应中的对象

javascript - 如何使用push方法或类似方法在javascript中构造一个对象而不是数组对象