0

我一直在努力解决这个问题,但想不出一个正则表达式来完成以下任务:

输入字符串(这是被许多其他 JSON 包围的 JSON 数据):

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

其中 12 也可以是像“1.2”这样的小数,或者像 1288 或 1.288 这样更大。

所需字符串:

..."natural_order":12...

使用 php preg_replace,到目前为止我已经得到:

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

但只返回:

"12"

任何想法都非常感谢!

4

2 回答 2

2

我建议不要使用棘手的正则表达式,而是建议以下内容:

$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);
于 2011-08-11T03:58:31.207 回答
0

我可以想到两种解决方案。第一个,我不会费心写出来,是使用 解码 JSON json_decode,通过将值解析为整数来更正值,然后重新编码字符串。

第二个是继续你的道路。然而,JSON 是一个相当复杂的字符串,仅使用正则表达式无法可靠地解析。如果您确信该模式"natural_order":"value"不会出现在其他地方,您可以试试这个:

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

这应该匹配任何封装的键,后跟一个冒号,后跟一个封装的有效浮点数。如果冒号周围有空格,也会有转义。

于 2011-08-11T03:58:00.300 回答