去除多余的空白行,使用正则表达式 preg_replace("/^s*$/m", "", $lrc)。
将歌词文本按行分割,使用 explode("n", $lrc)。
循环每一行歌词内容,使用正则表达式 preg_match_all("/[(d{2}):(d{2})(?:.(d{2,3}))?]/", $lines[$i], $matches) 匹配时间标签和歌词内容。
如果匹配到时间标签,则获取开始时间和结束时间。其中,若歌词内容直接跟在最后一个时间标签之后的情况,需要根据下一行的时间标签计算结束时间;否则,将结束时间设为开始时间+5秒。
根据开始和结束时间以及歌词内容构建SRT字幕内容,并将其存入 $srt 字符串中。
返回 $srt 字符串。
这个函数的主要作用是将 LRC 格式的歌词转换为 SRT 格式的字幕,以便于在视频播放器中显示歌词。
代码:
function lrc2srt($lrc) {
// print_r($lrc);
// 去除多余的空白行
$lrc = preg_replace("/^s*$/m", "", $lrc);
// 按行分割
$lines = explode("n", $lrc);
$count = count($lines);
// print_r($lines);
$srt = '';
$index = 1;
for ($i = 0; $i < $count; $i++) {
// 匹配时间标签和歌词内容
preg_match_all("/[(d{2}):(d{2})(?:.(d{2,3}))?]/", $lines[$i], $matches);
// print_r($matches);
if (!empty($matches[0])) {
// 获取时间标签
$startHour = intval($matches[1][0]);
$startMinute = intval($matches[2][0]);
$startSecond = intval($matches[3][0]);
// $startTime = sprintf("%02d:%02d:%02d,%03d", 0,$startHour, $startMinute, $startSecond);
$startTime = sprintf('%02d:%02d:%02d,%03d', 0, $startHour, $startMinute, $startSecond * 10);
// 获取歌词内容
if (strpos($lines[$i], ']') === false) {
// 特殊情况:歌词内容直接跟在最后一个时间标签之后的情况
$lyric = trim(substr($lines[$i], strlen($matches[0][0])));
if ($i < $count - 1 && strpos($lines[$i + 1], '[') !== false) {
// 下一行是新的时间标签,计算结束时间
preg_match_all("/[(d{2}):(d{2})(?:.(d{2,3}))?]/", $lines[$i + 1], $nextMatches);
$endHour = intval($nextMatches[1][0]);
$endMinute = intval($nextMatches[2][0]);
$endSecond = intval($nextMatches[3][0]);
} else {
// 下一行无新的时间标签,将结束时间设为开始时间+5秒
$endHour = $startHour;
$endMinute = $startMinute;
$endSecond = $startSecond + 5;
}
} else {
$lyric = trim(preg_replace("/[(d{2}):(d{2})(?:.(d{2,3}))?]/", "", $lines[$i]));
// 获取下一行的时间标签
preg_match_all("/[(d{2}):(d{2})(?:.(d{2,3}))?]/", $lines[$i + 1], $nextMatches);
if (!empty($nextMatches[0])) {
// 计算结束时间
$endHour = intval($nextMatches[1][0]);
$endMinute = intval($nextMatches[2][0]);
$endSecond = intval($nextMatches[3][0]);
} else if ($i !== $count - 1) {
// 下一行无时间标签,将结束时间设为开始时间+5秒
$endHour = $startHour;
$endMinute = $startMinute;
$endSecond = $startSecond + 5;
}
}
// 计算结束时间
// $endTime = sprintf("%02d:%02d:%02d,%03d", 0, $endHour, $endMinute, $endSecond);
$endTime = sprintf('%02d:%02d:%02d,%03d', 0, $endHour, $endMinute, ($endSecond - 5) * 10);
if(!empty($lyric)){
// 构建SRT字幕内容
$srt .= $index . "n";
$srt .= $startTime . ' --> ' . $endTime . "n";
$srt .= $lyric . "nn";
$index++;
}
}
}
return $srt;
}
}