代码之家  ›  专栏  ›  技术社区  ›  SaidbakR

php preg_替换日期时间和匹配项

  •  0
  • SaidbakR  · 技术社区  · 7 年前

    我想将mysql datetime格式字符串的样式设置为如下所示:

    <b>2018-07-09</b><i>10:25:00</i>
    

    我想用 preg_replace() 要替换匹配的模式,请执行以下操作:

    preg_replace("/([^\s]+)/",\'<b>$1</b><i>$2</i>\',$date)
    

    然而,模式 https://regex101.com/r/LLRx3x/1 ,表示有两个匹配项,其中每个匹配项有一个组。第一场比赛是日期,第二场比赛是时间。我不能利用 $1 $2 访问和替换每个匹配项。以上 preg_match 代码返回如下内容:

    <b>2018-07-09</b><i></i> <b>13:25:18</b><i></i> 那么,我如何才能访问每一场比赛并替换它们来实现我的目标呢?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    您可以将日期和时间分成两组,然后使用 $1 $2 :

    preg_replace('~^(\S+)\s+(\S+)$~', '<b>$1</b><i>$2</i>', $date)
    

    查看 regex demo 和A PHP demo .

    注意, $n 替换backreferences只引用相应的捕获组值,因此如果您在模式中定义了一个捕获组,那么只有1个捕获可以通过 1美元 2美元 将持有空字符串,即 preg_replace('~^(\S+)\s+\S+$~', '<b>$1</b><i>$2</i>', '2018-07-09 13:25:18') 会屈服的 <b>2018-07-09</b><i></i> )

    因此,这里的重点是匹配日期和时间,但将它们捕获到单独的捕获组中,然后相应地使用相应的回溯引用。

    图案细节

    • ^ -字符串的开头
    • (\S+) -捕获组1(后文提到 1美元 backreference):任何1+非空白字符
    • \s+ -1+空白
    • (s+) -捕获组2(后文提到 2美元 backreference):任何1+非空白字符
    • $ -字符串结尾。