Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm trying to replace multiple regex matches with different text, just like that, but not working :/

This is my string:

str = [answers] => [{"pref1":0,"answerTime":800},{"pref2":0,"answerTime":800},{"pref3":0,"answerTime":800},{"pref4":0,"answerTime":800},{"pref5":0,"answerTime":800}]

I want to replace each answer time do a random time from an array list, like:

$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);

But everytime i the method below, all the results return me the same time:

$postpop = preg_replace('#"answerTime":(.*?),"#', array($replace), $reqpop);
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
298 views
Welcome To Ask or Share your Answers For Others

1 Answer

Judging by your other SO account's question using my previous coding attempt with your sample $_POST data, this should be right for your task:

Method #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);

Method #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":Kd+/',function($m)use($time){return $time[array_rand($time)];},$_POST['answers']);
var_export($_POST);

The K in the regex pattern says: "start the fullstring match from here", then it matches only the digits that follow answerTime:.

Possible output with either method:

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',
)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...