如何将部分无效的 JSON 转换为有效的?

How to convert partially invalid JSON to a valid one?

我正在使用 php 抓取网页并获取此字符串:

'[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]'

无效json,键名被封装...

我使用preg_replace创建有效的json:

$x = '[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]'
$j = preg_replace('/(\w+)\s{0,1}:/', '"":', $x);

并得到这个值:

'[{"endTime":"2019-06-"05T17":"15":00.000+"10":00","startTime":"2019-06-"05T17":"00":00.000+"10":00"}]'

但我想要这个值:

'[{"endTime":"2019-06-05T17:15:00.000+10:00","startTime":"2019-06-05T17:00:00.000+10:00"}]'

如何解决这个问题?

使用这个模式:

([{,])([^:]+):

它会找到所有跟在{,

后面的文本

并用它来替换:

"":

它会在你的单词两边加上一个双引号。

正则表达式 1

你原来的表达方式好像是find,我们稍微修改一下为:

([{,])(\w+)(\s+)?:

它可能会起作用,我们正在添加一个左边界:

([{,])

和右边界:

:

我们的关键属性在这个捕获组中:

(\w+)

正则表达式 2

我们可以将第一个表达式扩展为:

([{,])(\s+)?(\w+)(\s+)?:

以防万一,我们可能在关键属性之前有空格:

Demo

测试 1

$re = '/([{,])(\w+)(\s+)?:/m';
$x = '[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]';
$subst = '"":';

$result = preg_replace($re, $subst, $x);

echo $result;

测试 2

$re = '/([{,])(\s+)?(\w+)(\s+)?:/m';
$x = '[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]';
$subst = '"":';

$result = preg_replace($re, $subst, $x);

echo $result;

输出

[{"endTime":"2019-06-05T17:15:00.000+10:00","startTime":"2019-06-05T17:00:00.000+10:00"}]

Demo

正则表达式电路

jex.im 可视化正则表达式: