Parse a SRT file with jQuery Javascript

前端 未结 3 834
攒了一身酷
攒了一身酷 2021-01-01 02:24

I\'m trying to parse .srt but I get an internal error and I can\'t figure out what is it.

Here is my code:

    var subtitles;
    jQuery         


        
相关标签:
3条回答
  • 2021-01-01 02:49

    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>

    0 讨论(0)
  • 2021-01-01 02:49

    It is better to use the following regex to cover them if the number of lines of text in each section increases

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

    View the output on the console

    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>

    0 讨论(0)
  • 2021-01-01 02:51
    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/

    0 讨论(0)
提交回复
热议问题