PHP preg_replace日期时间和匹配项

时间:2018-07-09 12:26:45

标签: php regex preg-replace

我想要设置MySQL日期时间格式字符串的样式,如下所示:

<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 个答案:

答案 0 :(得分:2)

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

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

请参见regex demoPHP demo

请注意,$n替换后向引用仅引用相应的捕获组值,因此,如果您在模式中定义了一个捕获组,则$1$2仅可访问1个捕获将包含一个空字符串,即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反向引用):任意1个以上非空格字符
  • \s+-超过1个空格
  • (\S+)-捕获组2(后来称为$2反向引用):任意1个以上非空格字符
  • $-字符串的结尾。