регулярное выражение, PHP - удалить одинарные, двойные кавычки и обратную косую черту из сложной строки JSON - PullRequest
0 голосов
/ 16 декабря 2018

Следующий фрагмент - просто часть большего json.Этот json передается через вызов ajax со стороны клиента на сторону сервера в PHP.Структура json имеет атрибут value во многих местах .И этот json создается из плагина jQuery.

Фрагмент кода:

{"1": { "value": "abcdefg ", "style": {"autoFormatter": {}}}}

Перед сохранением значения в базе данных мне нужно удалить любые одинарные кавычки ('), двойные кавычки ("") или обратную косую черту () изчасть значения (то есть abcdefg) атрибута значения.Поэтому я пытаюсь запустить регулярное выражение в полном формате json, чтобы удалить все вхождения ранее упомянутых символов.

Например, "value":"xyz'abc" следует заменить на "value":"xyzabc"

Чтодолжен быть правильный путь?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Ответ на немного другой вопрос

Это то, что называется «проблемой XY».Вы пытаетесь решить проблему Y («Удаление проблемных символов SQL из JSON»), когда ваша фактическая проблема - это проблема X:

Мне нужно извлечь ее позже из БД идержать его в переменной JavaScript.Затем я вызываю метод fromJson плагина jQuery, который я использую.

Итак, что вам нужно , нужно : " способ хранения текстового значения в 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 и где их найти»).

0 голосов
/ 16 декабря 2018

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

--- UPDATE ---

Просто используйтестрока json как объект в html позже без использования $ .parseJSON (jsonString).

<?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>
0 голосов
/ 16 декабря 2018

Простейшим способом было бы, я думаю,

  • импортировать 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 может быть сконструировано как "спасибо, но нет".

Старые 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...