我试图用不同的文本替换多个正则表达式匹配,就像那样,但不能正常工作:/
这是我的字符串:
str = [answers] => [{"pref1":0,"answerTime":800},{"pref2":0,"answerTime":800},{"pref3":0,"answerTime":800},{"pref4":0,"answerTime":800},{"pref5":0,"answerTime":800}]
我想从数组列表中随机替换每个回答时间,例如:
$time = array('"answerTime":1000,"','"answerTime":800,"','"answerTime":1200,"','"answerTime":1100,"','"answerTime":1500,"','"answerTime":900,"');
$rnd1 = $time[array_rand($time, 1)];
$rnd2 = $time[array_rand($time, 1)];
$rnd3 = $time[array_rand($time, 1)];
$rnd4 = $time[array_rand($time, 1)];
$rnd5 = $time[array_rand($time, 1)];
$replace = array($rnd1, $rnd2, $rnd3, $rnd4, $rnd5);
但每次我使用下面的方法时,所有结果都会在同一时间返回:
$postpop = preg_replace('#"answerTime":(.*?),"#', array($replace), $reqpop);
答案 0 :(得分:1)
根据your other SO account's question使用我之前对您的样本$_POST
数据进行的编码尝试判断,这应该适合您的任务:
方法#1:(The non-regex / more stable way)
$_POST=[
'authToken'=>'0a65e943412453ecec35c814',
'sessionId'=>'431503466924',
'answers' => '[{"Boost":false,"answerTime":1300,"id":3},{"Boost":false,"answerTime":800,"id":1},{"Boost":false,"answerTime":900,"id":3},{"Boost":false,"answerTime":1000,"id":1},{"Boost":false,"answerTime":1200,"id":1}]',
'userId' =>'2235'
];
$time=[800,900,1000,1100,1200,1500];
$answers=json_decode($_POST['answers'],true); // convert "answers" value to an array
foreach($answers as &$a){ // iterate each subarray
$a['answerTime']=$time[array_rand($time)]; // replace the previous answerTime value with a new random one
}
$_POST['answers']=json_encode($answers); // apply updated & re-encoded "answers" string to $_POST
var_export($_POST);
方法#2:(The regex / less stable way)
$_POST=[
'authToken'=>'0a65e943412453ecec35c814',
'sessionId'=>'431503466924',
'answers' => '[{"Boost":false,"answerTime":1300,"id":3},{"Boost":false,"answerTime":800,"id":1},{"Boost":false,"answerTime":900,"id":3},{"Boost":false,"answerTime":1000,"id":1},{"Boost":false,"answerTime":1200,"id":1}]',
'userId' =>'2235'
];
$time=[800,900,1000,1100,1200,1500];
$_POST['answers']=preg_replace_callback('/answerTime":\K\d+/',function($m)use($time){return $time[array_rand($time)];},$_POST['answers']);
var_export($_POST);
正则表达式模式中的\K
说:"从此处开始全字符串匹配",然后它只匹配answerTime:
后面的数字。
使用任一方法输出的可能:
array (
'authToken' => '0a65e943412453ecec35c814',
'sessionId' => '431503466924',
'answers' => '[{"Boost":false,"answerTime":1200,"id":3},{"Boost":false,"answerTime":1000,"id":1},{"Boost":false,"answerTime":1500,"id":3},{"Boost":false,"answerTime":900,"id":1},{"Boost":false,"answerTime":800,"id":1}]',
'userId' => '2235',
)