从字幕中找到相应的文本

时间:2019-03-21 06:27:29

标签: javascript data-structures subtitle

我有这样的文本文件(字幕):

  

每行都有文本的开始时间和结束时间

45.123 : 55.002 = this_is_subtitle_of_video
58.101 : 64.022 = next_text_and_so_on 
...
...
458.101 : 564.022 = final_text_of_video 

从youtube API中,我可以这样获取当前时间(秒)123.06(秒)

  

当我具有视频的当前时间时(如何使用数组或   另一个数据结构)...

算法应该可以快速运行(在网站上播放视频时)

2 个答案:

答案 0 :(得分:0)

您可以split在每个\n处的文本并在每一行中循环。然后使用正则表达式

/(\d+.\d+) : (\d+.\d+) = (.*)/

match分别将开始时间和结束时间以及字幕放在单独的捕获组中

function findSubtitle(text, time) {
  let lines = str.split("\n");

  for (let i = 0; i < lines.length; i++) {
    [,start, finish, subtitle] = lines[i].match(/(\d+.\d+) : (\d+.\d+) = (.*)/);
    if (time >= start && finish >= time) {
      return subtitle
    }
  }
}

let str = `45.123 : 55.002 = this_is_subtitle_of_video
58.101 : 64.022 = next_text_and_so_on 
458.101 : 564.022 = final_text_of_video`

console.log(findSubtitle(str, 60.006))
console.log(findSubtitle(str, 48))

如果要从此文本中反复找到字幕,可以使用map创建字幕数组。每当需要find字幕时,请使用数组和时间来调用该函数。这样,您不必每次都想要字幕时splitmatch

function findSubtitle(array, time) {
  let inner = array.find(a => time >= a[0] && a[1] >= time) || [];
  return inner[2];
}

let str = `45.123 : 55.002 = this_is_subtitle_of_video
58.101 : 64.022 = next_text_and_so_on 
458.101 : 564.022 = final_text_of_video`

let subArray = str.split("\n")
                  .map(a => a.match(/(\d+.\d+) : (\d+.\d+) = (.*)/).slice(1))

console.log(findSubtitle(subArray, 60))
console.log(findSubtitle(subArray, 48))

答案 1 :(得分:0)

您提到它已经可以在带有小视频的简单阵列中使用,因此您可以简单地用地图替换阵列。

(请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map