Php 字幕中SRT和VTT语法的正则表达式匹配

Php 字幕中SRT和VTT语法的正则表达式匹配,php,regex,regex-group,srt,vtt,Php,Regex,Regex Group,Srt,Vtt,我有两个srt和vtt格式的字幕,我需要匹配和删除格式特定的语法,只是得到干净的文字行 我想出了这个正则表达式: /\n?\d*?\n?^.*-->[012345]{2}:.*$/m 样品含量(混合srt和vtt): 这与中模拟的字幕编号和时间匹配 但当在代码本身中使用时(甚至直接使用从中生成的代码段),这将只匹配时间,而不是字幕编号 见输出: array (5) 0 => array (1) 0 => "00:00:04,019 --> 00:00:07,299 " (30)

我有两个srt和vtt格式的字幕,我需要匹配和删除格式特定的语法,只是得到干净的文字行

我想出了这个正则表达式:
/\n?\d*?\n?^.*-->[012345]{2}:.*$/m

样品含量(混合srt和vtt):

这与中模拟的字幕编号和时间匹配

但当在代码本身中使用时(甚至直接使用从中生成的代码段),这将只匹配时间,而不是字幕编号

见输出:

array (5)
0 => array (1)
0 => "00:00:04,019 --> 00:00:07,299
" (30)
1 => array (1)
0 => "
00:00:07,414 --> 00:00:09,155
" (31)
2 => array (1)
0 => "
00:00:09,276 --> 00:00:11,429
" (31)
3 => array (1)
0 => "
00:00:11,549 --> 00:00:14,874
" (31)
4 => array (1)
0 => "
00:00:11,549 --> 00:00:14,874
" (31)
可在以下位置进行测试:

目标是匹配字幕编号,例如,第一个预期匹配应为:

1
00:00:04,019 --> 00:00:07,299

我不太确定,这是否是你想要捕捉的。但是,原因是您可能希望使用捕获组来包装字符串,以便更容易获取。例如,捕获组如何围绕所需角色工作的示例:

^([0-9]+\n|)([0-9:,->\s]+)

这可能不是这样做的方式,也不是最好的表达方式。然而,它可能会给你一个想法,以不同的方式处理这个问题

我猜您可能希望捕获日期时间行和之前的行,这些行可能有数字,也可能没有数字

图表 此图显示了表达式的工作方式,您可以通过以下方式可视化其他表达式:

在将数据发送到正则表达式引擎之前,您可能需要编写一个脚本来清理数据,这样您就可以得到一个简单的表达式

使用JavaScript进行示例测试
const regex=/^([0-9]+\n |)([0-9:,->\s]+)/mg;
常量str=`1
00:00:04,019 --> 00:00:07,299
第1行
第2行
2.
00:00:07,414 --> 00:00:09,155
第1行
00:00:09,276 --> 00:00:11,429
第1行
00:00:11,549 --> 00:00:14,874
第1行
第2行
`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});

}
您可以将表达式的这一部分
\n?\d*?\n?
设置为可选组,以匹配1+个数字,后跟换行符。字符类
[012345]
也可以写成
[0-5]

您可以将表达式更新为:

^(?:\d+\n)?.*\h+-->\h+[0-5]{2}:.*$
  • ^
    字符串的开头
  • (?:\d+\n)?
    可选1+位数和换行符
  • *\h+-->\h+匹配除换行符、1+水平空白字符、
    -->`和1+水平空白字符以外的任何字符的0+倍
  • [0-5]{2}:
    匹配2次0-5
  • *
    匹配0+乘以除换行符以外的任何字符
  • $
    字符串结尾

|

感谢Emma的全面回复,我真的不需要使用capture group,因为我稍后只需运行
preg_split
即可删除匹配项并获得具有干净线条的阵列,尝试了您的方法,发现它与我的示例中未列出的几个案例不匹配-此处更新:很好,从您的解决方案中选择了一些想法谢谢,最后,我提出了类似的解决方案,似乎也如预期的那样有效:
^(?:\n?\d.\n^)?.\h+-->\h+[0-5]{2}:.$
()因为我从你的答案中得到了灵感,所以我会将它标记为一个答案
^(?:\d+\n)?.*\h+-->\h+[0-5]{2}:.*$