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

问题描述 投票:5回答:2

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

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

我想用preg_match('/[0-9]{4}/', '????', $data);

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

php string digits colon
2个回答
5
投票

一种方法可能是使用preg_replace代替并使用捕获组捕获2倍2位数字(\d{2})(\d{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


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);
© www.soinside.com 2019 - 2024. All rights reserved.