我想为来自不同来源的数据建立一个通用的清理程序。对于清理,我的意思是(在这个阶段)将 htmlspecialchars 应用于字符串。现在,来自这些源的数据可以是任何东西,从对象到数组再到字符串,都是嵌套的(而且很复杂),并且格式总是有点不同。
所以我想到了一个递归 htmlspecialchars 函数,该函数将自身应用于数组和对象,并且仅将 htmlspecialchars 应用于字符串,但是如何递归地遍历对象呢?
Thanks.
EDIT:我想我应该提到这一点 - 我实际上正在构建一个严重依赖 JS 和 JSON 进行客户端-服务器通信的 RIA。服务器所做的唯一事情就是从数据库中获取内容并通过 JSON 将其返回给客户端,格式如下:
{"stat":"ok","data":{...}}
正如我所说,数据可以是任何东西,不仅来自字符串形式的数据库,还来自 XML
处理JSON的流程如下:
- 从 DB/XML 获取数据(源编码为 iso-8859-1)
将它们放入“data”数组中
-
使用递归从 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);
}
}
}
使用 PHP 的json_encode
将数据转换为 JSON
将数据发送(回显)到客户端
使用 JS 渲染数据(例如放入表格中)
介于两者之间,数据应该以某种方式进行清理(在这个阶段只有 htmlspecialchars)。现在的问题应该是:在哪里消毒,用什么方法?
您可以尝试以下方法
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 '<div>A</div>' (length=24)
1 => string '<div>B</div>' (length=24)
2 => string '<div>C</div>' (length=24)
3 =>
object(MyClass)[1]
...
array
0 =>
object(MyClass)[2]
public 'var1' => string '<b>value 1</b>' (length=26)
public 'var2' => string '<b>value 2</b>' (length=26)
public 'var3' =>
array
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)