- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
1
00:00:00,074 --> 00:00:02,564
Previously on Breaking Bad...
2
00:00:02,663 --> 00:00:04,393
Words...
我需要用 php 解析 srt 文件,并用变量打印文件中的所有 subs。
我找不到合适的正则表达式。执行此操作时,我需要获取 id、时间和字幕变量。并且打印时不能没有 array() 等。必须与原始文件中的打印相同。
我的意思是我必须像这样打印;
$number <br> (e.g. 1)
$time <br> (e.g. 00:00:00,074 --> 00:00:02,564)
$subtitle <br> (e.g. Previously on Breaking Bad...)
顺便说一句,我有这段代码。但它看不到线条。它必须被编辑,但如何编辑?
$srt_file = file('test.srt',FILE_IGNORE_NEW_LINES);
$regex = "/^(\d)+ ([\d]+:[\d]+:[\d]+,[\d]+) --> ([\d]+:[\d]+:[\d]+,[\d]+) (\w.+)/";
foreach($srt_file as $srt){
preg_match($regex,$srt,$srt_lines);
print_r($srt_lines);
echo '<br />';
}
最佳答案
这是一个简短的状态机,用于逐行解析 SRT 文件:
define('SRT_STATE_SUBNUMBER', 0);
define('SRT_STATE_TIME', 1);
define('SRT_STATE_TEXT', 2);
define('SRT_STATE_BLANK', 3);
$lines = file('test.srt');
$subs = array();
$state = SRT_STATE_SUBNUMBER;
$subNum = 0;
$subText = '';
$subTime = '';
foreach($lines as $line) {
switch($state) {
case SRT_STATE_SUBNUMBER:
$subNum = trim($line);
$state = SRT_STATE_TIME;
break;
case SRT_STATE_TIME:
$subTime = trim($line);
$state = SRT_STATE_TEXT;
break;
case SRT_STATE_TEXT:
if (trim($line) == '') {
$sub = new stdClass;
$sub->number = $subNum;
list($sub->startTime, $sub->stopTime) = explode(' --> ', $subTime);
$sub->text = $subText;
$subText = '';
$state = SRT_STATE_SUBNUMBER;
$subs[] = $sub;
} else {
$subText .= $line;
}
break;
}
}
if ($state == SRT_STATE_TEXT) {
// if file was missing the trailing newlines, we'll be in this
// state here. Append the last read text and add the last sub.
$sub->text = $subText;
$subs[] = $sub;
}
print_r($subs);
结果:
Array
(
[0] => stdClass Object
(
[number] => 1
[stopTime] => 00:00:24,400
[startTime] => 00:00:20,000
[text] => Altocumulus clouds occur between six thousand
)
[1] => stdClass Object
(
[number] => 2
[stopTime] => 00:00:27,800
[startTime] => 00:00:24,600
[text] => and twenty thousand feet above ground level.
)
)
然后您可以遍历 sub 数组或通过数组偏移量访问它们:
echo $subs[0]->number . ' says ' . $subs[0]->text . "\n";
通过遍历每个子项并显示它来显示所有子项:
foreach($subs as $sub) {
echo $sub->number . ' begins at ' . $sub->startTime .
' and ends at ' . $sub->stopTime . '. The text is: <br /><pre>' .
$sub->text . "</pre><br />\n";
}
进一步阅读:SubRip Text File Format
关于php - 解析 .srt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659118/
我想用正则表达式解析字幕。但不匹配多行文本。 正则表达式代码: (?(\d+))\n(?([\d:,]+))[\s-{2}\>]+(?([\d:,]+))\n(?(.+|\n)) https://re
我有一个srt文件 1 00:00:07,000 --> 00:00:09,000 Time to amaze the world.. create by Hazy 2 00:00:11,000 --
我正在使用这条线: exec_push /home/production/bin/ffmpeg -i rtmp://localhost:1935/live/slot4 -codec copy -g 1
所以我知道使用 FFMPEG 你可以阅读 srt://现在我现在您也可以拍摄视频并将其仅转换为音频。 但是我们遇到的问题是 我们不知道如何只发送视频中的音频srt到icecast服务器 到 iceca
我有一个 SRT 文件,想更改各个轨道的背景颜色和透明度。这可能吗,还是我必须采用更高级的格式?这个任务甚至可以在 FFMPEG 中工作吗? 1 0:0:1,440 --> 0:0:1,970 Y1
我用ffmpeg给视频加中文字幕。并且已经安装了 libass 库。 我执行以下命令会出现错误信息 ffmpeg -i video.mp4 -vf "ass=subtitle.srt" -y out.
标题说明了我真正需要的 ATM。 基本上我已经创建了一个基于 Tesseract 和 ImageMagick 的 OCR 工具链。我已经设法使输出文本非常一致。我正在使用它对一些旧的硬字幕视频进行 O
我尝试将文件读取为字符串,我尝试将其编码为 UTF-8 但仍然失败,它在输出中返回一些奇怪的字符。 这是我读取文件的函数: private static String readFile(String
我制作了一个脚本来在我的浏览器中编辑我的字幕。不在文本编辑器等中。所以我做了所有事情,我正处于最后阶段,当我单击“保存”按钮下载我编辑的版本时,我的浏览器会按预期自动下载 SRT 文件,但是副标题是显
我正在开发一个非常简单的程序,它将接收一个文件的名称和一个数字(您想从该文件延迟多少字幕),然后将该文件另存为另一个延迟时间的文件。我的问题是如何编写一个可以改变时间的函数。 假设文件看起来像这样:
我正在用 python 编写一个小脚本,但由于我是新手,所以我被困在了一个部分:我需要从 .srt 文件中获取时间和文本。例如,来自 1 00:00:01,000 --> 00:00:04,074 S
1 00:00:00,074 --> 00:00:02,564 Previously on Breaking Bad... 2 00:00:02,663 --> 00:00:04,393 Words.
我已经搜索过了,没有找到类似的东西。 我想要实现的是创建一个简单的 PHP/js/jq 脚本,它可以从 .srt 文件中添加或减去秒数。我不确定正则表达式是我应该用来实现它还是其他东西。 用户将上传/
我知道如何通过 ffmpeg 组合视频 1.mp4 和 srt 1.srt 文档, ffmpeg -i 1.mp4 -i 1.srt -map 0 -map 1 -c copy -crf 23 vid
我正在尝试显示 .srt 文件中的字幕。 (适用于安卓 4.1+)设备中同时存在mp4文件和srt文件。 public class MainActivity extends Activity impl
我是新手,我需要将 Srt(字幕文件)分成多个 block 。 例如:如果我有一个视频的字幕文件(60 分钟)。然后将字幕文件分割成6个字幕文件,每个字幕文件10分钟。 即 6 X 10 = 60 分
我一直在研究java上的字幕系统。可以保存正常的 .srt 文件并且字幕显示正常。我希望字幕具有不同的属性,例如 diff 字体/颜色/大小,所有这些属性都未编码在普通 .srt 中,该文件必须保存为
我接到了一项任务,要从如下所示的 txt 文件中读取模拟进程。 ID: 35; Arrival_Time: 0; Total_Exec_Time: 4; ID: 65; Arrival_Time: 2
Android 的 MediaPlayer 是否支持 SRT 字幕?我试图将 SRT 文件放在与视频文件相同的目录中并命名为相同的文件(当然除了扩展名),但没有任何运气让它们显示。有什么想法和建议吗?
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我是一名优秀的程序员,十分优秀!