.vtt文件的PHP正则表达式
我希望遍历现有的.vtt文件,并将提示数据读取到数据库中 .vtt文件的格式为:.vtt文件的PHP正则表达式,php,regex,webvtt,Php,Regex,Webvtt,我希望遍历现有的.vtt文件,并将提示数据读取到数据库中 .vtt文件的格式为: WEBVTT FILE line1 00:00:00.000 --> 00:00:10.000 ‘Stuff’ line2 00:00:10.000 --> 00:00:20.000 Other stuff Example with 2 lines line3 00:00:20.00 --> 00:00:30.000 Example with only 2 digits in millise
WEBVTT FILE
line1
00:00:00.000 --> 00:00:10.000
‘Stuff’
line2
00:00:10.000 --> 00:00:20.000
Other stuff
Example with 2 lines
line3
00:00:20.00 --> 00:00:30.000
Example with only 2 digits in milliseconds
line4
00:00:30.000 --> 00:00:40.000
Different stuff
00:00:40.000 --> 00:00:50.000
Example without a head line
最初,我试图使用^
和$
来对以下行进行严格控制:/^(\w*)$^(\d{2}):(\d{2}):(\d{2})\(\d{2,3}-->(\d{2,3}):(\d{2}):(\d{2}):(\d{2,3})$/ims
但我在正则表达式检查器中很难实现这一点,并使用\s
来处理行的开始/结束
目前我正在使用以下正则表达式:/(.*):(\d{2}):(\d{2}):(\d{2})\(\d{2,3}-->(\d{2}):(\d{2}):(\d{2})\(\d{2,3})s(.+)/im
这在一定程度上可以通过使用在线正则表达式检查器来实现,比如:(这个例子没有选择多行字幕,但是得到了第一行,这对于我来说已经足够好了,因为目前所有的字幕都是一行)。但是,如果我将其放入php(preg\u match\u all(/(.*)(\d{2}):(\d{2}):(\d{2})\(\d{2,3})-->(\d{2}):(\d{2}):(\d{2,3})\(\d{2,3})s(+.+)/mi“,$fileData,$matches)
)并转储结果,我会得到一个空数组
在线正则表达式和php之间可能有什么不同
提前感谢您的建议
编辑---
下面是$fileData的转储和$matches的转储:
string(341) "WEBVTT FILE
line1
00:00:00.000 --> 00:00:10.000
‘Stuff’
line2
00:00:10.000 --> 00:00:20.000
Other stuff
Example with 2 lines
line3
00:00:20.00 --> 00:00:30.000
Example with only 2 digits in milliseconds
line4
00:00:30.000 --> 00:00:40.000
Different stuff
00:00:40.000 --> 00:00:50.000
Example without a head line"
array(11) {
[0]=>
array(0) {}
[1]=>
array(0) {}
[2]=>
array(0) {}
[3]=>
array(0) {}
[4]=>
array(0) {}
[5]=>
array(0) {}
[6]=>
array(0) {}
[7]=>
array(0) {}
[8]=>
array(0) {}
[9]=>
array(0) {}
[10]=>
array(0) {}
}
正则表达式的问题是行尾处理不好
您在结尾处有这样的内容:\s(+)/mi
这只匹配1个空格,但换行符可以是1或2个空格
要修复它,可以使用\R(+)/mi
它在网站上起作用,因为它正在将您的新行规范化为Linux风格的新行。
也就是说,Windows样式的换行符是\r\n
(2个字符),Linux样式的换行符是\n
(1个字符)
或者,您可以尝试以下正则表达式:
/(?:line(\d+)\R)?(\d{2}(?::\d{2}){2}\.\d{2,3})\s*-->\s*(\d{2}(?::\d{2}){2}\.\d{2,3})\R((?:[^\r\n]|\r?\n[^\r\n])*)(?:\r?\n\r?\n|$)/i
它看起来很可怕,但很管用。
注意:我在\R
和\R\n
之间切换,因为\R
与[]
中的R
文本匹配
数据的捕获方式如下:
行号(如有)
初始时间戳
最终时间戳
多行文字
你可以试穿一下
您可以使用方便的代码生成器工具生成以下PHP:
$re = '/(?:line(\d+)\R)?(\d{2}(?::\d{2}){2}\.\d{2,3})\s*-->\s*(\d{2}(?::\d{2}){2}\.\d{2,3})\R((?:[^\r\n]|\r?\n[^\r\n])*)(?:\r?\n\r?\n|$)/i';
$str = 'WEBVTT FILE
line1
00:00:00.000 --> 00:00:10.000
‘Stuff’
line2
00:00:10.000 --> 00:00:20.000
Other stuff
Example with 2 lines
line3
00:00:20.00 --> 00:00:30.000
Example with only 2 digits in milliseconds
line4
00:00:30.000 --> 00:00:40.000
Different stuff
00:00:40.000 --> 00:00:50.000
Example without a head line';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
您可以在变量$fileData
中的所有数据都是吗?因此,您没有得到这些匹配项:我转储了$fileData的内容,所有内容对我来说都是正确的-我已将转储添加到原始问题中以供参考。/(?:line(\d+)\R)?(\d{2}(:\d{2}){2}.\d{2,3})s*-->\s*(\d{2}(:\d{2}){2}.\d{3})R((?:\R\n]:\R*\n[\R}]/我
工作得很好-也感谢你的解释不客气,谢谢你的反馈。当我很高兴你们接受了我的答案,我很高兴你们接受了我的答案,我总是建议你们在接受我的答案之前等待1-2天,以防有人给出另一个答案。我恢复了我的预期捕获。我恢复了我的预期捕获如下:/(代码>/(:(:(\代码>(\w+)(\d{我很高兴你们接受了你们接受我的答案,我总是建议在接受之前等待1-2天1-2天,我总是建议在接受之前等待1-2天,以等待1-2天,如果有人做出另一个回答,如果有人做出另一个答案。我的回答。我建议。我总是建议在接受之前等待1-1-1-1-1-1-1-1-1-1-1-2天等待1-1-1-2天,如果有人再等1-1-2天,如果有人再等1-2天,如果有人做出回答。我的回答。我的回答。我的元)/我
要我修改答案吗?我不得不重做这些例子和东西。我不知道所谓的协议是什么——我曾假设我上面对我使用的正则表达式的评论足以让人们找到和参考。