我正在使用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"}]'
如何解决此问题?
答案 0 :(得分:1)
您的原始表达似乎已经找到,我们将其稍作修改为:
([{,])(\w+)(\s+)?:
它可能会起作用,我们添加了一个左边界:
([{,])
和右边界:
:
,我们的关键属性在此捕获组中:
(\w+)
我们可以将第一个表达式扩展为:
([{,])(\s+)?(\w+)(\s+)?:
以防万一,我们可能在key属性之前有空格:
$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;
$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"}]
jex.im可视化正则表达式:
答案 1 :(得分:0)
使用此模式:
([{,])([^:]+):
它将找到{
或,
并将其用于替换:
$1"$2":
它将在单词的两边加上一个双引号。