修改字符串内的 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
不需要使用捕获组,只需要寻找符合条件的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
这样的时间。验证 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);
我有一个字符串,我想修改所有 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
(\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
不需要使用捕获组,只需要寻找符合条件的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
这样的时间。验证 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);