正则表达式找到第一和第二,"每一行都会出现

时间:2016-09-18 16:24:19

标签: php regex text

我有很多行格式化为:

{"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."},

如果我能找到每一行,"的第一次和第二次出现,我就能做到这一点

2 个答案:

答案 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));