我有一个字符串,我想修改所有4位数字并在其之间插入冒号。示例:1320将变为13:20
$data = "The time is 1020 and the time is 1340 and 1550";
我正在考虑使用preg_match('/[0-9]{4}/', '????', $data);
但是不确定如何在预浸料中再次传递相同的值吗?
答案 0 :(得分:5)
一种方法可能是改用preg_replace并使用捕获组来捕获字边界(\d{2})(\d{2})
之间的2位数2 \b
在替换中,使用$1:$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
答案 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
之类的时间。验证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);