我正在嘗試將 mkvinfo 輸出中的每一種音頻和字幕語言都放入數組中,我已經嘗試了各種谷歌搜索和 RegExr 上的正則表達式組合,但沒有成功。我的源字符串是| + Muxing application: libmkv 0.6.5| + Writing application: HandBrake rev5474| + Timecode scale: 1000000| + Duration: 6788.031s (01:53:08.031)|+ Segment tracks| + A track| + Track number: 1 (track ID for mkvmerge & mkvextract: 0)| + Track UID: 718870071| + Track type: video| + Lacing flag: 0| + Codec ID: V_MPEG4/ISO/AVC| + CodecPrivate, length 45 (h.264 profile: High @L3.1)| + Default duration: 41.708ms (23.976 frames/fields per second for a video track)| + Default flag: 1| + MinCache: 1| + Video track| + Pixel width: 1280| + Pixel height: 536| + Display width: 1280| + Display height: 536| + A track| + Track number: 2 (track ID for mkvmerge & mkvextract: 1)| + Track UID: 1000053498| + Track type: audio| + Lacing flag: 0| + Codec ID: A_AAC| + CodecPrivate, length 2| + Language: fre| + Default flag: 1| + Audio track| + Sampling frequency: 48000| + Channels: 2| + A track| + Track number: 3 (track ID for mkvmerge & mkvextract: 2)| + Track UID: 1097600287| + Track type: audio| + Lacing flag: 0| + Codec ID: A_AAC| + CodecPrivate, length 2| + Language: eng| + Default flag: 0| + Audio track| + Sampling frequency: 48000| + Channels: 2| + A track| + Track number: 4 (track ID for mkvmerge & mkvextract: 3)| + Track UID: 1976675274| + Track type: subtitles| + Lacing flag: 0| + Codec ID: S_TEXT/UTF8| + Language: fre| + Default flag: 0| + A track| + Track number: 5 (track ID for mkvmerge & mkvextract: 4)| + Track UID: 1930079859| + Track type: subtitles| + Lacing flag: 0| + Codec ID: S_TEXT/UTF8| + Language: fre| + Default flag: 0|+ Cluster使用正則表達式Language:\s([a-z]+)我可以獲得所有音頻和字幕Language: freLanguage: engLanguage: freLanguage: fre理想的輸出是Array( [audio] => Array ( [0] => eng [1] => fre ) [subtitles] => Array ( [0] => fre [1] => fre ))任何幫助將不勝感激,提前致謝,最好
1 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
您可以使用交替來匹配 2 個捕獲組中的任一值,并使用點匹配換行符(?s)
然后,您可以使用組 1 作為鍵來組裝結果數組,并將組 2 的值添加到組 1 鍵。
(?s)\+\h+Track?type:\h+(audio|subtitles)\b.*?\+\h+Language:\h+([a-z]+)
例如
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$result = [];
foreach ($matches as $match) {
? ? $result[$match[1]][] = $match[2];
}
print_r($result);
輸出
Array
(
? ? [audio] => Array
? ? ? ? (
? ? ? ? ? ? [0] => fre
? ? ? ? ? ? [1] => eng
? ? ? ? )
? ? [subtitles] => Array
? ? ? ? (
? ? ? ? ? ? [0] => fre
? ? ? ? ? ? [1] => fre
? ? ? ? )
)
不需要的更精確的模式可以(?s)匹配Track type:和匹配所有不以 A track 或 Language 開頭的行:
^\|\h+\+\h+Track type:\h+(audio|subtitles)(?:\R(?!\|\h+\+\h+(?:[A-Z] track$|Language:)).*)*\R\|\h+\+ Language:\h+([a-z]+)
- 1 回答
- 0 關注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消