马黑黑 发表于 2023-1-16 17:36

一步剥离lrc格式文本的时间与歌词信息

本帖最后由 马黑黑 于 2023-1-16 17:38 编辑

对lrc歌词的处理,我们的花潮LRC在线制作程序早已实现,但一般难以直观看到其转换lrc为花潮格式的原理。这里提供一个处理机制,因为应对的是标准的lrc歌词结构,这个机制非常简洁。

首先了解一下最常见的lrc格式,以网易云音乐在线歌词为例,把头尾去掉后,它长酱紫:

朱红色的纽扣镶上你送我的钗\n金玉口难开纵然你只为伊而改\n游走在巷门外灯影盼我离开\n躲开你眼神留我一个人去猜\n今后的小说里会有我\n被世俗推脱被年华错过\n逃离这一时世的迷离\n能否换你共度三生烟火

里面有很多 \n ,其实这是换行符,所以上面的lrc也可以写成酱紫:

朱红色的纽扣镶上你送我的钗
金玉口难开纵然你只为伊而改
游走在巷门外灯影盼我离开
躲开你眼神留我一个人去猜
今后的小说里会有我
被世俗推脱被年华错过
逃离这一时世的迷离
能否换你共度三生烟火

不论怎么写,分行还是用 \n 表示,我们都把它看成一个分行的字符串,把它放到一个字符串变量里:

let str = `
朱红色的纽扣镶上你送我的钗
金玉口难开纵然你只为伊而改
游走在巷门外灯影盼我离开
躲开你眼神留我一个人去猜
今后的小说里会有我
被世俗推脱被年华错过
逃离这一时世的迷离
能否换你共度三生烟火
`;

注意观察歌词里有没有反引号 ` ,如有,会发生冲突,把它转义 \` 或换成变得字符。

然后我们写一个小函数:

let foo = (str) => {
      let reg = /\[(\d{2}:\d{2}.\d{2})\](.*)/g;
      if(str.match(reg)) {
                str = str.replace(reg,'$1,$2');
      }
      return str;
};


函数很简单:先构建一个正则,让它去匹配中括号内的时间和中括号外面的字符串,表达式里将时间信息分为第一组,歌词信息分为第二组。接着,用 match 去检测匹配函数调用者传递来的 str 参数,如果匹配,则处理 str 值,用 replace 替换正则表达式匹配的内容,替换为 $1 和 $2 ,$1 对应正则表达式所匹配的中括号里的内容,$2 对应的是中括号以外的内容即歌词。最后,将替换后的 str 返回给调用者。

如果我们这样调用函数:

console.log(foo(str));

则,在浏览器的控制台,会看到这样的结果:

00:14.70,朱红色的纽扣镶上你送我的钗
00:18.42,金玉口难开纵然你只为伊而改
00:22.20,游走在巷门外灯影盼我离开
00:26.04,躲开你眼神留我一个人去猜
00:29.67,今后的小说里会有我
00:33.45,被世俗推脱被年华错过
00:37.14,逃离这一时世的迷离
00:40.95,能否换你共度三生烟火


这是我们所需要的结果吧?

当然,这里只是简单处理,真正要做事,还有很多事情要考虑、细化。

马黑黑 发表于 2023-1-16 17:41

当然,如果直接用 replace 或 replaceAll 替换掉符号 [ 和 ] 也是可以的,那还要简洁。

红影 发表于 2023-1-16 18:23

这样一处理,果然简洁很多{:4_187:}

红影 发表于 2023-1-16 18:29

这种书写方式是和函数调用方式紧密相关的吧?

马黑黑 发表于 2023-1-16 18:59

红影 发表于 2023-1-16 18:23
这样一处理,果然简洁很多

取得两种信息是基础,在这个基础上,同步歌词中按 @小辣椒 所说的“直接同步”就可以了,当然细节还会很多

马黑黑 发表于 2023-1-16 19:00

红影 发表于 2023-1-16 18:29
这种书写方式是和函数调用方式紧密相关的吧?

函数是去处理原本的格式,将原本格式里的东东取出自己所要的东东。函数的编写,总是根据需要来的。

红影 发表于 2023-1-16 21:11

马黑黑 发表于 2023-1-16 18:59
取得两种信息是基础,在这个基础上,同步歌词中按 @小辣椒 所说的“直接同步”就可以了,当然细节还会很 ...

全考虑周全也挺不容易的{:4_204:}

马黑黑 发表于 2023-1-16 21:12

红影 发表于 2023-1-16 21:11
全考虑周全也挺不容易的

需要考虑和处理的细节很多的

红影 发表于 2023-1-16 21:14

马黑黑 发表于 2023-1-16 19:00
函数是去处理原本的格式,将原本格式里的东东取出自己所要的东东。函数的编写,总是根据需要来的。

嗯,歌词的表达看着简单了,其他要花的功夫也不少{:4_173:}

马黑黑 发表于 2023-1-16 21:15

红影 发表于 2023-1-16 21:14
嗯,歌词的表达看着简单了,其他要花的功夫也不少

是的

红影 发表于 2023-1-16 22:02

马黑黑 发表于 2023-1-16 21:15
是的

黑黑真棒{:4_187:}

红影 发表于 2023-1-16 22:04

马黑黑 发表于 2023-1-16 21:12
需要考虑和处理的细节很多的

看起来还挺费工夫的,这个我就不懂了,估计要你自己钻研了{:4_204:}

马黑黑 发表于 2023-1-16 22:08

红影 发表于 2023-1-16 22:04
看起来还挺费工夫的,这个我就不懂了,估计要你自己钻研了

好的{:4_170:}

马黑黑 发表于 2023-1-16 22:08

红影 发表于 2023-1-16 22:02
黑黑真棒

{:4_203:}

红影 发表于 2023-1-17 14:01

马黑黑 发表于 2023-1-16 22:08
好的

我来端茶递水{:4_190:}

马黑黑 发表于 2023-1-17 17:36

红影 发表于 2023-1-17 14:01
我来端茶递水

不敢当不敢当

红影 发表于 2023-1-17 21:24

马黑黑 发表于 2023-1-17 17:36
不敢当不敢当

别的忙也帮不上啊,不懂代码{:4_173:}

马黑黑 发表于 2023-1-17 22:25

红影 发表于 2023-1-17 21:24
别的忙也帮不上啊,不懂代码

那也不至于劳驾你

红影 发表于 2023-1-18 16:04

马黑黑 发表于 2023-1-17 22:25
那也不至于劳驾你

呵呵,我是被嫌弃了呗{:4_173:}

马黑黑 发表于 2023-1-18 18:23

红影 发表于 2023-1-18 16:04
呵呵,我是被嫌弃了呗

你是高端人才,怎能端茶倒水呢
页: [1] 2
查看完整版本: 一步剥离lrc格式文本的时间与歌词信息