以下代码段只是较大json的一部分。这个json是通过ajax调用从PHP的客户端传递到服务器端的。 json结构在许多地方都具有值属性 。而这个json是由jQuery插件产生的。
代码段:
{“ 1”: {“值”:“ abcdefg ”,“样式”: { “ autoFormatter”:{} } } }
在将值保存到数据库中之前,我需要从value属性的值部分(即abcdefg)中删除任何单引号('),双引号(“”)或反斜杠()。因此,我试图在完整的json中运行一个正则表达式,以便删除前面提到的所有字符。
例如,"value":"xyz'abc"
应该更改为"value":"xyzabc"
正确的方法应该是什么?
答案 0 :(得分:2)
我认为最简单的方法是
类似的东西:
$arr = json_decode($str, true);
// Modify $arr.
array_walk_recursive($arr, function(&$value, $key) {
if ('value' === $key) {
$value = str_replace([ '"', "'", '\\' ], '', $value);
}
});
$str = json_encode($arr);
使用正则表达式解析JSON字符串可能costrued为“谢谢,但没有”。
function cleanvalues(&$value, $key) {
// Programmers from Blefuscu usually write this as
// if ($key == $value)
// -- feel free.
if ('value' === $key) {
// Haven't tested this, and don't think it's faster, but
// regexes can be used here:
// $value = preg_replace('#["\'\\\\]+#', '', $value);
$value = str_replace(array('"', "'", '\\'), '', $value);
}
}
array_walk_recursive($arr, 'cleanvalues');
答案 1 :(得分:0)
这就是所谓的“ XY问题”。当您的实际问题是问题X时,您正在尝试解决问题Y(“从JSON中删除SQL问题字符”):
我稍后需要从数据库中获取它,并将其保存在javascript变量中。然后,我调用正在使用的jQuery插件的fromJson方法。
所以,需要是:“ 一种以SQL中立,JSON中立,Javascript中立表示形式存储文本值的方式。”
您可以使用Base64来做到这一点。使用Base64作为您的应用程序层之间的“通用语言”-SQL,Javascript和PHP。然后,当它们进入边界时对值进行解码,并在它们再次出局时对其进行编码:
$value = "string with weird JSON that won't go into SQL";
$val2 = base64_encode($value);
...now $val2 is stored into SQL and can be retrieved with no problems
(search can be difficult but can be done, somewhat).
然后,您检索$val2
并将其毫无问题地存储到Javascript中,只记得它是base64。是的,这会占用更多的空间,但是如今这真的是一个问题吗?
// Value recovered from SQL through PHP
var base64val = '{$val2}';
// base64val is a safe string, but useless.
var trueval = btoa(base64val);
// trueval is a JSON string, but not yet decoded.
var fromjson = JSON.parse(trueval);
// finally fromjson holds the real value
现在,您有了一个工作流程,所有内容都可以使用-您可以在其中添加斜杠,美元符号,引号,双引号,更重要的是,很多UTF8字符会破坏我以前的答案(您可能想读一些有关“格式错误的UTF8攻击以及在何处找到它们的信息”)。
答案 2 :(得分:0)
我创建了一个小测试来找出问题所在。首先,我认为您在将json字符串写入数据库时遇到问题,因为您没有使用任何类型的“ escape_string”或绑定参数。
---更新---
稍后只需在不使用$ .parseJSON(jsonString)的情况下,将json字符串用作html中的对象即可。
<?php
/*
CREATE TABLE `table_53805089_test` (
`id` int(11) NOT NULL,
`json` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
// Example json string from ajax call
$jsonFromAjaxRequest = '{"1":{"value":"ab\"cd\'efg","style":{"autoFormatter":{}}}}';
// Connect to database
$mysqli = new mysqli('localhost', 'root', '', 'stackoverflow');
// Write into database
$query = 'REPLACE INTO `table_53805089_test`
(`id`, `json`)
VALUES (1, \'' . $mysqli->escape_string($jsonFromAjaxRequest) . '\')';
$mysqli->query($query);
// Read from database
$query = 'SELECT json FROM `table_53805089_test` WHERE id = 1';
$result = $mysqli->query($query);
$row = $result->fetch_assoc();
// Use in html -> javscript variable
?>
<!DOCTYPE html>
<html>
<head><title>test</title></head>
<body>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
// Error:
// jsonString = '<?php echo $row['json']; ?>';
// $(document).ready(function () {
// data = $.parseJSON(jsonString);
// console.log(data);
//});
// Works:
var jsonData = <?php echo $row['json']; ?>;
console.log(jsonData['1']['value']);
// Suggestion in case $row['json'] is empty
var jsonData = <?php echo $row['json'] ?: '{}' ?>;
console.log(jsonData['1']['value']);
</script>
</body>
</html>