红穆笔记
首頁 語言筆記 php 將lrc文件的歌詞轉換爲str字幕
語言筆記 PHP

php 將lrc文件的歌詞轉換爲str字幕

php 将lrc文件的歌词转换为str字幕

該函數是一段將歌詞文件轉換爲SRT字幕文件的PHP代碼。具體實現過程如下:

  • 去除多餘的空白行,使用正則表達式 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 . "\n\n";
    
                $index++;
            }
        }
    }

    return $srt;
}
}
微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

PHP ob函数记录

PHP ob函數記錄 語言筆記 PHP

下面3個函數的用法 ob_get_contents(); ob_end_clean(); ob_start(); 可以藉助這幾個函數實現緩衝本地文件,以及執行本地腳本代碼。 使用ob_start()把輸出的代碼存到緩衝區,頁面不會顯示出來; 然後用ob_get_contents得到緩衝區的數據。 o…
👁 141
PHP preg

PHP preg 語言筆記 PHP

preg_match_all 函數用於執行一個全局正則表達式匹配。preg_match_all() 語法int preg_match_all ( string $pattern , string $subject [, array &amp;$matches [, int $flags = PREG…
👁 169
PHP 三元运算符与if的详解

PHP 三元運算符與if的詳解 語言筆記 PHP

三元運算符語條件 ? 結果1 : 結果2 說明:問號前面的位置是判斷的條件,如果滿足條件時結果1,不滿足時結果2。本文對三元運算符和if...else...進行對比詳解,希望對大家有所幫助。今天在改論文在線的時候遇到了一個語句看不懂:$if_summary = $row['IF_SUMMARY']=…
👁 189
PHP强制转换类型

PHP強制轉換類型 語言筆記 PHP PHP採集 PHP與mysql

獲取數據類型1.如果想查看某個表達式的值和類型,用var_dump()。 2.如果只是想得到一個易讀懂的類型的表達方式用於調試,用 gettype()。3.要查看某個類型,不要用 gettype(),而用is_type() 函數。字符串轉換爲數值當一個字符串被當作數字來求值時,根據以下規則來決定結果…
👁 232
php 字符串中是否包含指定字符串的多种方法

php 字符串中是否包含指定字符串的多種方法 語言筆記 PHP

strstrstrstr() 函數搜索一個字符串在另一個字符串中的第一次出現。該函數返回字符串的其餘部分(從匹配點)。如果未找到所搜索的字符串,則返回 false。代碼如下:&lt;?php $email = 'user@example.com'; $domain = strstr($email, …
👁 138

推薦閱讀

木纹地板墙砖类网站模板 0933

木紋地板牆磚類網站模板 0933 實用收藏 易優模板

一款針對木紋地板與牆磚類行業的eyoucms網站模板。設計風格現代家裝,能夠展示地板產品、牆磚系列、空間搭配及品牌故事。有助於建材品牌在線上展示產品,吸引裝修公司與業主。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CM…
👁 61
木材防腐木建材类网站模板 0257

木材防腐木建材類網站模板 0257 實用收藏 易優模板

此套eyoucms模板適用於木材、防腐木與建材行業,設計風格自然質樸,能夠展示防腐木產品、木材建材、工程案例及品牌故事。有助於木材企業在線上展示產品,吸引建築與戶外客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CM…
👁 40
(自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载 0778

(自適應手機端)響應式新聞博客知識類pbootcms網站模板 自媒體運營博客網站源碼下載 0778 實用收藏 pbootcms模板

一款響應式新聞博客與自媒體運營PbootCMS網站模板,支持PC與WAP端。設計風格簡潔信息流,適合自媒體人分享行業動態、運營技巧及個人觀點。有助於自媒體人在線上建立影響力與粉絲羣體。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.c…
👁 53
(PC+WAP)黑色门窗定制网站pbootcms模板 五金建材行业网站源码下载 0132

(PC+WAP)黑色門窗定製網站pbootcms模板 五金建材行業網站源碼下載 0132 實用收藏 pbootcms模板

一款針對黑色門窗定製與五金建材行業的PbootCMS網站模板,支持PC和移動端。設計風格現代大氣,能夠很好地展示門窗產品系列與建材貿易實力。有助於門窗品牌或建材公司在線上搭建品牌形象站,提升營銷推廣效果。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼…
👁 45
mysqli_free_result() expects parameter 1 to be mysqli_result, object given in

mysqli_free_result() expects parameter 1 to be mysqli_result, object given in 踩坑總結

這個錯誤通常表示您正在嘗試使用 mysqli_free_result() 函數釋放一個無效的結果集對象。這可能是因爲您正在嘗試釋放一個已經被釋放的結果集,或者您正在嘗試釋放一個不是結果集對象的東西。要解決這個問題,請確保您正在向 mysqli_free_result() 函數傳遞有效的結果集對象。您…
👁 219
防腐木制品建筑网站模板 0934

防腐木製品建築網站模板 0934 實用收藏 易優模板

此套eyoucms模板適用於防腐木製品與建築行業,設計風格自然質樸,能夠展示防腐木產品、建築材料、工程案例及品牌故事。有助於木材企業在線上展示產品,吸引建築與戶外客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CMS…
👁 43