Использование php preg_replace для анализа целевых двойных кавычек в строке JSON - PullRequest
0 голосов
/ 11 августа 2011

Я бьюсь над этим и не могу найти регулярное выражение для выполнения следующего:

Входная строка (это данные JSON, окруженные множеством других JSON):

$string=..."natural_order":"12"...

, где 12 также может быть десятичным, как "1.2", или может быть больше, как 1288 или 1.288.

Желаемая строка:

..."natural_order":12...

Использование php preg_replace,до сих пор я получил:

preg_replace('/[^natural_order:]+"/', '', $string);

но только возвращает:

"12"

Любые мысли с благодарностью!

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Вместо хитрого регулярного выражения, я бы предложил что-то вроде этого:

$array = json_decode($string, true);
array_walk_recursive($array, function (&$value, $key) {
    if ($key == 'natural_order') {
        $value = strpos($value, '.') ? (float)$value : (int)$value;
    }
});
$string = json_encode($array);
0 голосов
/ 11 августа 2011

Я могу придумать два решения.Первым, который я не буду писать, будет декодировать JSON с использованием json_decode, исправить значения, разобрав их в целые числа, и перекодировать строку.

Второе - продолжитьвниз по твоему пути.Тем не менее, JSON является довольно сложной строкой и не может быть надежно проанализирован с помощью регулярного выражения.Если вы уверены, что шаблон "natural_order":"value" не будет отображаться где-то еще, вы можете попробовать это:

$result = preg_replace('/"natural_order"\s*\:\s*"([-+]?[0-9]*\.?[0-9]+)"/', '"natural_order":$1', $string);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...