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

时间:2019-04-06 12:18:50

标签: php string digits colon

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

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

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

但是不确定如何在预浸料中再次传递相同的值吗?

2 个答案:

答案 0 :(得分:5)

一种方法可能是改用preg_replace并使用捕获组来捕获字边界(\d{2})(\d{2})之间的2位数2 \b

在替换中,使用$1:$2

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

结果:

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

Php demo

答案 1 :(得分:3)

您不需要使用捕获组,只需要查找合格的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之类的时间。验证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);