Parse a SRT file with jQuery Javascript

最后都变了- 提交于 2019-12-03 20:12:25
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
       }
  });

Demo

https://jsfiddle.net/5v7wz4bq/

Here is one problem:

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

At this line, when there isn't any ' --> ' to split, the returned length of the array is 1, which errors when you ask for array item 2.

And here is another:

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

Neither is the subtitles declared, nor its properties .number, ... etc.

Update

Here is a sample that works (switched the jQuery "read srt file" part for the data)

var data = document.getElementById("data").innerHTML;
data = data.replace(/>/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>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!