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

时间:2019-06-03 03:55:12

标签: php json regex regex-lookarounds regex-group

我正在使用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}:/', '"\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"}]'

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

RegEx 1

您的原始表达似乎已经找到,我们将其稍作修改为:

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

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

([{,])

和右边界:

:

,我们的关键属性在此捕获组中:

(\w+)

RegEx 2

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

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

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

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 = '$1"$2":';

$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 = '$1"$3":';

$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

RegEx电路

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

enter image description here

答案 1 :(得分:0)

使用此模式:

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

它将找到{,

之后的所有文本

并将其用于替换:

$1"$2":

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