Вам не нужно использовать группы захвата, вам просто нужно найти подходящие 4-значные подстроки и нацелиться на позицию нулевой длины в середине подстроки.
Код: ( Демо )
$data = "The time is 1020 and the time is 1340 and 1550";
echo preg_replace('~\b\d{2}\K(?=\d{2}\b)~', ':', $data);
Выход:
The time is 10:20 and the time is 13:40 and 15:50
\b
- это граница слова, которая обеспечивает совпадение первой цифры в последовательности
\d{2}
соответствует первым двум цифрам
\K
«перезапускает полное совпадение строк» - фактически забывает две предыдущие цифры
(?=\d{2}\b)
означает две цифры, за которыми не следует цифра.
preg_replace()
заменяет позицию нулевой длины на двоеточие.
Если вы хотите улучшить проверку с помощью этой замены, вы можете указать некоторые известные диапазоны символов, например:
echo preg_replace('~\b[0-2]\d\K(?=[0-5]\d\b)~', ':', $data);
Конечно, вышесказанное не на 100% надежно, потому что оно соответствует времени, подобному 2900
. Проверка всего между 0000
и 2400
становится значительно более опасной:
echo preg_replace('~\b(?:(?:(?:[01]\d|2[0-3])\K(?=[0-5]\d\b))|(?:24\K(?=00\b)))~', ':', $data);
* обратите внимание, мне не нравится включение 2400
, но я прочитал аргументы, утверждающие, что это допустимое время. Вот почему я включаю это.
Если вы хотите опустить 2400
в качестве допустимого значения, тогда оно немного более управляемо (0000
- 2359
):
echo preg_replace('~\b(?:[01]\d|2[0-3])\K(?=[0-5]\d\b)~', ':', $data);