【问题标题】:Modify a 4 digit number inside of a string and inserting colon修改字符串内的 4 位数字并插入冒号
【发布时间】:2019-08-28 03:51:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您的preg_match 用法是向后的,参数2 是要搜索的字符串,参数3 是匹配项。你可以做$match[0] . $match[1] . ':' . $match[2] . $match[3]。不过,下面的答案似乎更干净。

标签: php string digits colon


【解决方案1】:

一种方法是改用preg_replace 并使用捕获组在字边界\b 之间捕获2 次2 数字(\d{2})(\d{2})

在替换中使用 $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

【讨论】:

    【解决方案2】:

    您不需要使用捕获组,您只需要寻找符合条件的 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2010-10-17
      • 2022-11-18
      • 2021-05-18
      相关资源
      最近更新 更多