PHP .vtt 文件的正则表达式
PHP Regex for .vtt files
我希望遍历现有的 .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 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
但我很难在正则表达式检查器中使用它并使用 \s
来处理行 start/ends.
目前我正在使用以下正则表达式:/(.*)\s(\d{2}):(\d{2}):(\d{2})\.(\d{2,3}) --> (\d{2}):(\d{2}):(\d{2})\.(\d{2,3})\s(.+)/im
这部分使用在线正则表达式检查器可以工作,例如: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)
) 并转储结果,我将得到一个空数组数组。
在线正则表达式和 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
数据是这样抓取的:
- 行号(如果存在)
- 初始时间戳
- 最终时间戳
- 多行文本
你可以在https://regex101.com/r/Yk8iD1/1
上试试
您可以使用方便的代码生成器工具生成以下内容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);
您可以在 http://sandbox.onlinephpfunctions.com/code/7f5362f56e912f3504ed075e7013071059cdee7b
上进行测试
我希望遍历现有的 .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 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
但我很难在正则表达式检查器中使用它并使用 \s
来处理行 start/ends.
目前我正在使用以下正则表达式:/(.*)\s(\d{2}):(\d{2}):(\d{2})\.(\d{2,3}) --> (\d{2}):(\d{2}):(\d{2})\.(\d{2,3})\s(.+)/im
这部分使用在线正则表达式检查器可以工作,例如: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)
) 并转储结果,我将得到一个空数组数组。
在线正则表达式和 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
数据是这样抓取的:
- 行号(如果存在)
- 初始时间戳
- 最终时间戳
- 多行文本
你可以在https://regex101.com/r/Yk8iD1/1
上试试您可以使用方便的代码生成器工具生成以下内容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);
您可以在 http://sandbox.onlinephpfunctions.com/code/7f5362f56e912f3504ed075e7013071059cdee7b
上进行测试