【问题标题】:Parse a SRT file with jQuery Javascript使用 jQuery Javascript 解析 SRT 文件
【发布时间】:2015-10-15 10:13:02
【问题描述】:

我正在尝试解析 .srt,但我得到一个内部错误,我无法弄清楚它是什么。

这是我的代码:

    var subtitles;
    jQuery.get('SB_LKRG-eng.srt', function(data) {
        //alert(data);
        function strip(s) {
            return s.replace(/^\s+|\s+$/g,"");
        }
        srt = data.replace(/\r\n|\r|\n/g, '\n');
        //alert(srt);
        srt = strip(srt);
        //alert(srt);
        var srt_ = srt.split('\n\n');
        alert(srt_);
        var cont = 0;
        for(s in srt_) {
            st = srt_[s].split('\n');
            alert(st);
            if(st.length >=2) {
              n = st[0];
              i = strip(st[1].split(' --> ')[0]);
              o = strip(st[1].split(' --> ')[1]);
              t = st[2];

              if(st.length > 2) {
                for(j=3; j<st.length;j++)
                  t += '\n'+st[j];
              }

            subtitles[cont].number = n;
            subtitles[cont].start = i;
            subtitles[cont].end = o;
            subtitles[cont].text = t;
            //alert(subtitles[cont].start);
            }
            cont++;
        }

    });

我可以提取前4个字幕,然后代码停止并中断exception: TypeError,我不明白为什么...... 这里是字幕文件的示例:

1
00:00:01,000 --> 00:00:04,000
Descargados de www.AllSubs.org

2
00:00:49,581 --> 00:00:52,049
Bueno, tienes que escapar, tengo que ir a jugar

3
00:00:52,084 --> 00:00:55,178
Tengo que encontrar un día que está lleno de nada más que sol

4
00:00:55,220 --> 00:00:57,552
Crucero por la calle, moviéndose al compás

5
00:00:57,589 --> 00:01:00,683
Todos los que conoces está teniendo nada más que diversión

6
00:01:00,726 --> 00:01:03,251
Deja todo detrás de ti

7
00:01:03,295 --> 00:01:06,128
Siente esas palmeras soplan

8
00:01:06,165 --> 00:01:09,157
La gente en el norte no puede encontrar

9
00:01:09,201 --> 00:01:11,829
Están fuera de palear la nieve

10
00:01:11,870 --> 00:01:14,998
El tiempo para moverse, pero no seas lento

11
00:01:15,040 --> 00:01:17,941
En sus marcas, prepárate para ir

部分代码来自:http://v2v.cc/~j/jquery.srt/jquery.srt.js

谁能帮帮我?

谢谢

【问题讨论】:

  • 你能把.srt文件(或其部分)的内容贴出来吗?
  • @hindmost 我已经发布了.srt 文件的样本,谢谢!
  • @LGSon 我已经编辑了帖子,因为这个功能对我的问题并不重要,谢谢!!
  • cont++; 不应该在for 循环内吗?
  • 抱歉,我在if(st.length &gt;=2) { 声明中提到了?

标签: javascript jquery srt


【解决方案1】:
var PF_SRT = function() {
  //SRT format
  var pattern = /(\d+)\n([\d:,]+)\s+-{2}\>\s+([\d:,]+)\n([\s\S]*?(?=\n{2}|$))/gm;
  var _regExp;

  var init = function() {
    _regExp = new RegExp(pattern);
  };
  var parse = function(f) {
    if (typeof(f) != "string")
      throw "Sorry, Parser accept string only.";

    var result = [];
    if (f == null)
      return _subtitles;

    f = f.replace(/\r\n|\r|\n/g, '\n')

    while ((matches = pattern.exec(f)) != null) {
      result.push(toLineObj(matches));
    }
    return result;
  }
  var toLineObj = function(group) {
    return {
      line: group[1],
      startTime: group[2],
      endTime: group[3],
      text: group[4]
    };
  }
  init();
  return {
    parse: parse
  }
}();

 

  jQuery.get('demo.srt')
   .done(function(text) {
       try {
         //Array with {line, startTime, endTime, text}
         var result = PF_SRT.parse(text);
       } catch (e) {
         //handle parsing error
       }
  });

演示

https://jsfiddle.net/5v7wz4bq/

【讨论】:

  • 当我在这个小提琴演示中运行您的代码时,jsfiddle.net/876sscf7/4,它在第一次迭代的中间出错。你能解释一下为什么你的演示没有吗? ...顺便说一句,当我为内部拆分添加修复程序时,它可以工作jsfiddle.net/876sscf7/5
  • 您的小提琴使 st[1].split(' --> ')[1] 为空变量,因为 line2 上的脚本应该执行全局匹配,查找所有匹配项而不是在第一个匹配项后停止. jsfiddle.net/21kd95cj
  • 哇......我现在明白了......我典型的快速修复错误之一......感谢您的时间
  • 您的代码非常好。但是在一些.srt 文件上,我看到有些行只有时间没有文本,并且您的代码停在这一行!你能帮助我吗? jsfiddle.net/21kd95cj/4 on row 8 谢谢
  • @Parfait 我想,我解决了。请检查:jsfiddle.net/5v7wz4bq/5我只更改/(\d+)\n([\d:,]+)\s+-{2}\&gt;\s+([\d:,]+)\n([\s\S]*?(?=\n{2}|=\n{2}))/gm谢谢
【解决方案2】:

这里有一个问题:

o = strip(st[1].split(' --> ')[1]);

在这一行,当没有任何'-->'进行拆分时,返回的数组长度为1,当你请求数组项2时会出错。

还有一个:

subtitles[cont].number = n;
....

既没有声明subtitles,也没有声明它的属性.number,...等

更新

这是一个有效的示例(为数据切换了 jQuery“读取 srt 文件”部分)

var data = document.getElementById("data").innerHTML;
data = data.replace(/&gt;/g,">");

function strip(s) {
    return s.replace(/^\s+|\s+$/g,"");
}
srt = data.replace(/\r\n|\r|\n/g, '\n');
srt = strip(srt);
var srt_ = srt.split('\n\n');
var cont = 0;
var subtitles = [];

for(s in srt_) {
    st = srt_[s].split('\n');
    if(st.length >=2) {

        var st2 = st[1].split(' --> ');
        var t = st[2];

        if(st.length > 2) {
            for(j=3; j < st.length;j++)
                t += '\n'+st[j];
        }
        
        subtitles[cont] = { number : st[0],
                            start : st2[0],
                            end : st2[1],
                            text : t
                          }
        
        console.log(subtitles[cont].number + ": " + subtitles[cont].text);
        document.body.innerHTML += subtitles[cont].number + ": " + subtitles[cont].text + "<br>";
        cont++;
    }
}
<div id="data" style="display:none">1
00:00:01,000 --> 00:00:04,000
Descargados de www.AllSubs.org

2
00:00:49,581 --> 00:00:52,049
Bueno, tienes que escapar, tengo que ir a jugar

3
00:00:52,084 --> 00:00:55,178
Tengo que encontrar un día que está lleno de nada más que sol

4
00:00:55,220 --> 00:00:57,552
Crucero por la calle, moviéndose al compás

5
00:00:57,589 --> 00:01:00,683
Todos los que conoces está teniendo nada más que diversión

6
00:01:00,726 --> 00:01:03,251
Deja todo detrás de ti

7
00:01:03,295 --> 00:01:06,128
Siente esas palmeras soplan

8
00:01:06,165 --> 00:01:09,157
La gente en el norte no puede encontrar

9
00:01:09,201 --> 00:01:11,829
Están fuera de palear la nieve

10
00:01:11,870 --> 00:01:14,998
El tiempo para moverse, pero no seas lento

11
00:01:15,040 --> 00:01:17,941
En sus marcas, prepárate para ir
</div>

【讨论】:

    【解决方案3】:

    如果每个部分的文本行数增加,最好使用以下正则表达式来覆盖它们

    /(\d+)\n([\d:,]+)\s+-{2}\>\s+([\d:,]+)\n([\s\S]*?(?=\n{2}|$))/g
    

    在控制台查看输出

    let subtitle = document.getElementById('subtitle').value;
    console.log(_subtitle(subtitle));
    
    function _subtitle(text) {
    
            let Subtitle = text;
            let Pattern = /(\d+)\n([\d:,]+)\s+-{2}\>\s+([\d:,]+)\n([\s\S]*?(?=\n{2}|$))/g;
            let _regExp = new RegExp(Pattern);
            let result = [];
    
            if (typeof (text) != "string") throw "Sorry, Parser accept string only.";
            if (Subtitle === null) return Subtitle;
    
            let Parse = Subtitle.replace(/\r\n|\r|\n/g, '\n');
            let Matches;
    
            while ((Matches = Pattern.exec(Parse)) != null) {
    
    result.push({
                    Line: Matches[1],
                    Start: Matches[2],
                    End: Matches[3],
                    Text: Matches[4],
                })
    
            }
            
            return result;
    
        }
    <textarea id="subtitle">1
    00:00:00,000 --> 00:00:00,600
    Hi my friends
    
    2
    00:00:00,610 --> 00:00:01,050
    In the first line, everything works properly
    But there is a problem in the second line that I could not solve :(
    
    3
    00:00:01,080 --> 00:00:03,080
    But then everything is in order and good
    
    4
    00:00:03,280 --> 00:00:05,280
    You do me a great favor by helping me. Thankful</textarea>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      相关资源
      最近更新 更多