首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.vtt文件的

.vtt文件的
EN

Stack Overflow用户
提问于 2018-11-13 17:00:16
回答 1查看 488关注 0票数 0

我希望循环遍历现有的.vtt文件,并将提示数据读取到数据库中。

.vtt文件的格式如下:

代码语言:javascript
复制
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}):(\d{2}):(\d{2})\.(\d{2,3})$^(.+)$/ims的代码进行严格的约束,但我在regex检查器中很难做到这一点,并求助于使用\s来处理行的开始/结束。

目前,我正在使用以下正则表达式:/(.*)\s(\d{2}):(\d{2}):(\d{2})\.(\d{2,3}) --> (\d{2}):(\d{2}):(\d{2})\.(\d{2,3})\s(.+)/im

这部分使用了在线regex检查器,如:https://regex101.com/r/mmpObk/3 (本例没有提取多行字幕,但得到了第一行,这一点对我来说已经足够好了,因为目前所有字幕都是1行)。但是,如果将其放入php (preg_match_all("/(.*)\s(\d{2}):(\d{2}):(\d{2})\.(\d{2,3}) --> (\d{2}):(\d{2}):(\d{2})\.(\d{2,3})\s(.+)/mi", $fileData, $matches))并转储结果,就会得到一个空数组。

在线regex和php之间可能有什么不同?

谢谢您的建议。

编辑--下面是$fileData的转储和$matches的转储:

代码语言:javascript
复制
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) {}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 17:45:11

正则表达式的问题是行结束处理很差。

您在结尾处有一个:\s(.+)/mi

这只匹配一个空白,但换行符可以是1或2个空格。

要修复它,可以使用\R(.+)/mi

它在网站上工作,因为它正在将您的新行规范化为Linux样式的新行。

也就是说,Windows风格的换行符是\r\n (2个字符),Linux风格的是\n (1个字符).

或者,您可以尝试使用这个正则表达式:

代码语言:javascript
复制
/(?: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

这些数据如下所示:

  1. 行号(如果有)
  2. 初始时间戳
  3. 最后时间戳
  4. 多行文本

你可以在https://regex101.com/r/Yk8iD1/1上试试

您可以使用方便的代码生成器工具生成以下PHP:

代码语言:javascript
复制
$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);

你可以在http://sandbox.onlinephpfunctions.com/code/7f5362f56e912f3504ed075e7013071059cdee7b上测试它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53286052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档