PHP 要捕获的正则表达式 mm:ss.uuu AND hh:mm:ss.uuu

PHP Regex to Capture mm:ss.uuu AND hh:mm:ss.uuu

我正在尝试捕获一些字幕文件的时间戳,但运气不错。

我已经设法得到一个将部分捕获 hh:mm:ss.uuu 的表达式,如下面的 #910 所示,但我无法弄清楚如果可选的 h: 如何捕获组或 hh: 不存在。到目前为止,我的工作是 https://regex101.com/r/4QWySg/1。如您所见,它仅在遇到第一个小时后才捕获。

感谢任何帮助:)

909
59:48.420 --> 1:00:06.450
THERE SHOULD BE AN OPTION TO UNMUTE DO

910
1:00:06.460 --> 1:00:09.870
YOU SEE A MICROPHONE ICON ANYWHERE ON YOUR TEAMS


(^\d+$\R)?(\d{1,2}(?::\d{2}){2}\.\d{2,3})\s*-->\s*(\d{1,2}(?::\d{2}){2}\.\d{2,3})\R((?:[^\r\n]|\r?\n[^\r\n])*)(?:\r?\n\r?\n|$)

您可能需要对其进行编辑以符合您的其他规范(例如 \r\n 到目前为止您工作即将结束的内容),但这会标识所有时间戳和 post/caption您示例中的数字:

(^\d+$\R)?(^\d{2}:\d{2}.\d{3}|^\d{1,2}:\d{2}:\d{2}.\d{3})\s*-->\s*(\d{2}:\d{2}.\d{3}|\d{1,2}:\d{2}:\d{2}.\d{3})

我用的是管道 |创建匹配两种预期时间戳格式的 or 语句。

您可以简化正则表达式并在 PHP 中使用它获取所有匹配项:

((?:\d{1,2}:)?\d{2}:\d{2}\.\d{2,3})\s*-->\s*((?1))\R(.+)

RegEx Demo

正则表达式详细信息:

  • (: 开始捕获组#1
    • (?:\d{1,2}:)?:匹配可选的小时数字后跟 :
    • \d{2}:\d{2}\.\d{2,3}:匹配mm:ss.uuu部分
  • ): 结束捕获组#1
  • \h*-->\h*:匹配->两边可选空格包围
  • ((?1)):递归第一个 子模式 即使用与组 #1 中相同的模式进行匹配。在组 #2
  • 中捕获它
  • \R:匹配任意换行符
  • (.+):匹配第 3 个捕获组中任何字符的 1+ 个作为标题