如何将部分无效的 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 可视化正则表达式:
我正在使用 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 可视化正则表达式: