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

Php 如何将部分无效的JSON转换为有效的JSON?,php,json,regex,regex-lookarounds,regex-group,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"}]' $

我正在使用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"}]'
但我想要这个值:

'[{"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"$2":
([{,])([^:]+):
它将查找后面跟着
{

并将其用于替换:

$1"$2":
它会在单词的两边加上双引号。

RegEx 1 您的原始表达式似乎已找到,我们只需稍微修改一下即可:

([{,])(\w+)(\s+)?:
它可能会起作用,我们正在添加一个左边界:

([{,])
和一个右边界:

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

(\w+)

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

([{,])(\s+)?(\w+)(\s+)?:
在这种情况下,键属性前面可能有空格:

测试1 测试2 输出 正则表达式电路 可视化正则表达式:


Thanke@KonstantinSvintsov的可能重复-不,这并不能解决问题,因为我对单引号/双引号没有问题-它实际上指出了答案的问题-找到一个可以解析Javascript文本的解析器。不要尝试“修复”任意带regexen的字符串。你能推荐一个吗?我的谷歌搜索会和你的一样好…这很接近,但它太贪婪了,它在那个例子中起作用,但如果值包含逗号,它就在逗号上贪婪-例如值“21 Way street,Suburbant”你的例子似乎总是一个日期时间,也许你应该问得更清楚些:-)我同意-但这正是我遇到的问题-谢谢你的输入我的测试输出是:[“{”:“2019-06-05T17:15:00.000+10:00”,“2019-06-05T17:00:00.000+10:00”}]