Двойные кавычки при вводе пользователем приводят к неверному JSON - PullRequest
0 голосов
/ 17 октября 2019

У меня есть приложение, которое принимает объект JavaScript, превращает его в строку с помощью JSON.stringify () и передает эту строку в запросе ajax POST. Объект JavaScript содержит различные данные, включая некоторые пользовательские данные.

После отправки данных через запрос POST они декодируются с использованием json_decode () для обработки в виде массива. С этого момента данные, возвращаемые из приложения, являются нулевыми.

Пользовательский ввод в свойстве description содержит дополнительные двойные кавычки, которые, как я полагаю, приводят к недействительности данных.

Как я могуэкранировать двойные кавычки, введенные пользователем?

Пример данных:

{ name: "Susan", title: "Director", description: ""TEST""}

Примечание. Это простой пример данных. Фактические данные имеют вложенные объекты.

JavaScript:

let obj = this.objData,
json = JSON.stringify(obj)

$.ajax({
    method: 'post'
    url: url,
    data: {
       method: 'submit',
       form_data: json
    }
});

PHP:

$action=$_POST['method'];

$data=$_POST['form_data'];
$data=str_replace('\"','"',$data);
$data=str_replace("\'","'",$data);
$data=json_decode($data,true); // returns null

1 Ответ

0 голосов
/ 20 октября 2019

Я провел больше тестов в вашем коде, и для меня оказалось, что проблема связана не только с двойными кавычками, но и с форматом данных, полученным вашим PHP-кодом.

Итак, мы должнынаписать простой код, который исправляет входные данные PHP-файла.

Если вы отправляете эти входные данные в PHP-файл.

{ name: "Susan", title: "Director", description: ""TEST""}

, поскольку вы знаете, что это не тот формат, который может декодировать функция json_decode PHP,поэтому исправляя его, он будет выглядеть следующим образом.

{ "name": "Susan", "title": "Director", "description": "\"TEST\""}

Теперь, когда вы его декодируете, он отлично возвращает значение.

Я написал эту простую функцию для исправления данных JSON.

function fixJSON($str){
    $split = explode(',', substr(trim($str), 1, -1));

    $split = array_map(function($data){
        $inner_split = explode(':', $data);
        foreach($inner_split as $key => $value){
            $modified_value = substr(trim($value), 1, -1);
            if(strpos($modified_value, '"') === 0 && strrpos($modified_value, '"') === strlen($modified_value)-1){
                $inner_split[$key] = '"'. addslashes($modified_value) .'"';
            }elseif(strpos(trim($value), '"') !== 0 && strrpos($value, '"') !== strlen($value)-1){
                $inner_split[$key] = '"'. substr($value, 1) .'"';
            }
        }
        return implode(':', $inner_split);
    }, $split);

    $str = '{ ' . implode(', ', $split) . ' }';
    return $str;
}

Примеры.

$str = '{ name: "Susan", title: "Director", description: ""TEST""}';

print_r(json_decode($str, true)); // returns null as you faced before.

print_r(json_decode(fixJSON($str), true)); // everything good for now.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...