我有一个字符串,我想修改所有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代替并使用捕获组捕获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
您不需要使用捕获组,您只需要寻找符合条件的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);