修改字符串内的 4 位数字并插入冒号

Modify a 4 digit number inside of a string and inserting colon

我有一个字符串,我想修改所有 4 位数字并在它们之间插入冒号。示例:1320 将变为 13:20

$data = "The time is 1020 and the time is 1340 and 1550";

我正在考虑使用 preg_match('/[0-9]{4}/', '????', $data);

但不确定如何在 preg 中再次传递相同的值?

一种方法是改用 preg_replace 并使用捕获组在字边界 \b

之间捕获 2 次 2 位数字 (\d{2})(\d{2})

在替换中使用 2 个捕获组 :

$data = "The time is 1020 and the time is 1340 and 1550";
$data = preg_replace('/\b(\d{2})(\d{2})\b/', ":", $data);
echo $data;

结果:

The time is 10:20 and the time is 13:40 and 15:50

Php demo

不需要使用捕获组,只需要寻找符合条件的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 "restarts the full string match" -- 有效地忘记了前两位
(?=\d{2}\b) 是对后面没有数字的两位数字的前瞻。

preg_replace() 将零长度位置替换为冒号。


如果你想用这个替换改进验证,你可以像这样指定一些已知的字符范围:

echo preg_replace('~\b[0-2]\d\K(?=[0-5]\d\b)~', ':', $data);

当然,以上并不是 100% 可靠的,因为它会匹配像 2900 这样的时间。验证 00002400 之间的所有内容变得相当复杂:

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