PHP preg_replace 日期时间和匹配项

PHP preg_replace datetime and matches

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

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

我正在尝试使用 preg_replace() 替换匹配的模式,如下所示:

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

然而,模式https://regex101.com/r/LLRx3x/1表示有两场比赛,每场比赛都有一组。第一个匹配项是日期,第二个匹配项是时间。我无法利用 </code> 和 <code> 来访问和替换每个匹配项。上面的 preg_match 代码 returns 类似于:

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

您可以将日期和时间捕获为单独的 2 组,然后您可以使用 </code> 和 <code>:

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

参见regex demo and a PHP demo

请注意,$n 替换反向引用仅引用相应的捕获组值,因此如果您在模式中定义了一个捕获组,则只能使用 </code> 和 [=12 访问 1 个捕获=] 将保存一个空字符串,即 <code>preg_replace('~^(\S+)\s+\S+$~', '<b></b><i></i>', '2018-07-09 13:25:18') 将产生 <b>2018-07-09</b><i></i>).

所以,这里的重点是同时匹配日期和时间,但将它们捕获到单独的捕获组中,然后相应地使用相应的反向引用。

图案详情

  • ^ - 字符串的开头
  • (\S+) - 捕获第 1 组(稍后用 </code> 反向引用引用):任何 1+ 个非空白字符 </li> <li><code>\s+ - 1+ 个空格
  • (\S+) - 捕获第 2 组(稍后用 </code> 反向引用引用):任何 1+ 个非空白字符 </li> <li><code>$ - 字符串结尾。