forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.1 KiB
88 lines
2.1 KiB
3 years ago
|
package parse
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"regexp"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
|
||
|
//解析SRT行文本
|
||
|
func ParseSrtRows(rowText string , lineStart bool) (string , int , error) {
|
||
|
rowText = strings.TrimSpace(rowText)
|
||
|
|
||
|
if _,e := strconv.Atoi(rowText);e == nil && lineStart == false { //识别为字幕序号
|
||
|
return rowText , PARSE_SRT_NUMBER , nil
|
||
|
}
|
||
|
r := regexp.MustCompile(`(\d{1,2}:\d{1,2}:\d{1,2}[,|\.]\d{2,4})\s*-->\s*(\d{1,2}:\d{1,2}:\d{1,2}[,|\.]\d{2,4})`)
|
||
|
if r.Match([]byte(rowText)) == true {
|
||
|
timeResult := r.FindSubmatch([]byte(rowText))
|
||
|
if len(timeResult) != 3 {
|
||
|
return "" , 0 , errors.New("解析字幕时间错误")
|
||
|
}
|
||
|
times := strings.Join([]string{string(timeResult[1]) , string(timeResult[2])} , "-")
|
||
|
return times , PARSE_SRT_TIME_RANGE , nil
|
||
|
}
|
||
|
if rowText != "" {
|
||
|
return rowText , PARSE_SRT_SUBTITLE_TEXT , nil
|
||
|
} else {
|
||
|
return rowText , PARSE_SRT_TRIM , nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//校验srt字幕时间格式
|
||
|
func VaildateSrtTimeFormat(time string) bool {
|
||
|
r := regexp.MustCompile(`^(\d{1,2}:\d{1,2}:\d{1,2}[,|\.]\d{2,4})$`)
|
||
|
return r.Match([]byte(time))
|
||
|
}
|
||
|
|
||
|
|
||
|
//srt字幕时间文本 -> 秒
|
||
|
func SrtTimeFormatToSecond(time string) (float64 , error) {
|
||
|
if VaildateSrtTimeFormat(time) == false {
|
||
|
return 0 , errors.New("字幕时间格式不正确")
|
||
|
}
|
||
|
time = strings.Replace(time , "," , "." , 1)
|
||
|
timeSplit := strings.Split(time , ":")
|
||
|
if len(timeSplit) != 3 {
|
||
|
return 0 , errors.New("字幕时间格式不正确")
|
||
|
}
|
||
|
var second float64 = 0
|
||
|
for k,v := range timeSplit {
|
||
|
if vn, err := strconv.ParseFloat(v , 64); err != nil {
|
||
|
return 0 , errors.New("字幕时间解析失败")
|
||
|
} else {
|
||
|
if k == 0 {
|
||
|
second += vn * 3600
|
||
|
} else if k == 1 {
|
||
|
second += vn * 60
|
||
|
} else if k == 2 {
|
||
|
second += vn
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return second , nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func SubString(str string , begin int ,length int) (substr string) {
|
||
|
// 将字符串的转换成[]rune
|
||
|
rs := []rune(str)
|
||
|
lth := len(rs)
|
||
|
|
||
|
// 简单的越界判断
|
||
|
if begin < 0 {
|
||
|
begin = 0
|
||
|
}
|
||
|
if begin >= lth {
|
||
|
begin = lth
|
||
|
}
|
||
|
end := begin + length
|
||
|
if end > lth {
|
||
|
end = lth
|
||
|
}
|
||
|
// 返回子串
|
||
|
return string(rs[begin:end])
|
||
|
}
|