如何仅替换捕获的组?

Here is my REGEX:

.*time\s+(\d{2}:\d{2}\s(am|pm)).*

I have a string like this:

there is some text and maybe some number or symbols time 12:32 am and there is some text
//                                                  ^^^^^
//                                                       ^^^^^^^^

Now I need to replace that captured group with another time. Like these:

there is some text and maybe some number or symbols time 01:21 am and there is some text

or any other time ..! Actually my main pattern is this:

{anything}{time }{AnyDigit}{AnyDigit}{:}{AnyDigit}{AnyDigit }{am|pm }{anything}

Well, How can I do that? (replace a dynamic time with captured group)

You need to enclose the enclosing subpatterns into capturing groups and use backreferences to restore the captured values before and after a new time value:

'~(.*time\s+)(\d{2}:\d{2}\s[ap]m)(.*)~'
  ^    1    ^^        2         ^^ 3^

Replace with ${1}10:10 pm$3. The ${1} is an unambiguous numbered backreference to Group 1 captured text. It is necessary because the next character will most probably be a digit, and PHP always checks for the 2-digit backreference group if the $ is followed with 2 digits. If it sees $11, and if it does not find it, an error will pop up (unlike in JavaScript).

See demo

Here is an IDEONE demo:

$re = '~(.*time\s+)(\d{2}:\d{2}\s[ap]m)(.*)~'; 
$str = "there is some text and maybe some number or symbols time 12:32 am and there is some text"; 
$new_time = "10:10 pm"; 
$result = preg_replace($re, '${1}' . $new_time . '$3', $str);
echo $result;
// => there is some text and maybe some number or symbols time 10:10 pm and there is some text