您不需要使用捕获组,您只需要寻找符合条件的 4 位子字符串并定位子字符串中间的零长度位置。
代码:(Demo)
$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);