regex,PHP-从复杂的json字符串中删除单引号,双引号和反斜杠

时间:2018-12-16 18:10:28

标签: php jquery json regex

以下代码段只是较大json的一部分。这个json是通过ajax调用从PHP的客户端传递到服务器端的。 json结构在许多地方都具有值属性 。而这个json是由jQuery插件产生的。

代码段:

{“ 1”:    {“值”:“ abcdefg ”,“样式”:      {       “ autoFormatter”:{}      }    } }

在将值保存到数据库中之前,我需要从value属性的值部分(即abcdefg)中删除任何单引号('),双引号(“”)或反斜杠()。因此,我试图在完整的json中运行一个正则表达式,以便删除前面提到的所有字符。

例如,"value":"xyz'abc"应该更改为"value":"xyzabc"

正确的方法应该是什么?

3 个答案:

答案 0 :(得分:2)

我认为最简单的方法是

  • 将JSON导入PHP数组
  • 递归遍历数组
  • 将其存储回JSON字符串中。

类似的东西:

$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为“谢谢,但没有”。

较旧的PHP

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>