我有很多行格式化为:
{"id":1,"Melbourne is the capital of Australia.","correct":0,"Canberra is the capital of Australia."},
我需要将它转换为这种新格式:
{"id":1,"statement":"Melbourne is the capital of Australia.","correct":0,"answer":"Canberra is the capital of Australia."},
如果我能找到每一行,"
的第一次和第二次出现,我就能做到这一点
答案 0 :(得分:1)
我不知道你在实践中想要的模式有多严格,但这个模式应该有效
正则表达式:'(\{".*?":\d+\,)(.*)(".*?"\})'
替换:'\1"statement":\2"answer":\3'
<强>解释强>
(\{".*?":\d+\,)
捕获从{
开始到第一次出现,
的文字,
(.*)
在上述模式和下面的模式之间捕获文本。
(".*?"\})
捕获最后一次,
到}
结尾的文字,
其中捕获分别转到变量\1
,\2
,\3
。
其他强>
根据您希望正则表达式使用
的新请求 {"id":3,"Paris is the capital of France.","correct":1,NULL}
解决方案是你只需要替换最后一个正则表达式
(".*?"\})
到
((?:".*?"|NULL)\})
<强>解释强>
(?:...)
是一个非捕获组,这意味着您希望将某些模式组合在一起但不将其捕获到变量,例如\1
,\2
,\3
,{ {1}},
...
是一个替代。
请参阅DEMO
答案 1 :(得分:0)
没有preg_replace的方法:
$str = '{"id":1,"Melbourne is the capital of Australia.","correct":0,"Canberra is the capital of Australia."}';
$str = explode(',',$str);
$str[1] = '"statement":'.$str[1];
$str[3] = '"answer":'.$str[3];
$str = implode(',',$str);
var_dump(json_decode($str, true));