用不同的字符串替换多个正则表达式匹配

时间:2017-08-23 02:11:08

标签: php regex

我试图用不同的文本替换多个正则表达式匹配,就像那样,但不能正常工作:/

这是我的字符串:

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

1 个答案:

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