●分离歌词●
经过上面的解压歌词后,每句歌词内容都对应且仅对应一个时间标签,并且储存在数组"jieyageci_array"中。接下来我们要做的就是把时间和对应的内容再进行分离,分别储存在两个数组"shijian_array"和"neirong_array"中。
①按照上一节的思路,我们还把单行歌词储存在一个临时数组中,以第一句歌词为例:
var danhanggeci_array = jieyageci_array[0].split("]");
这时候,临时数组"danhanggeci_array"中就储存了两个元素:
danhanggeci_array[0]="[00:02.00"
danhanggeci_array[1]="词/曲:周杰伦"
这里比较麻烦的是时间元素,它不但多了个"[",而且又不是数字类型,在应用中不容易同歌曲播放时间进行比较从而实现歌词同步,所以这里必须对它进行处理。
1,祛除"[":
var shijianyuansu = danhanggeci_array[0].substring(1); //"shijianyuansu"是一个记录时间元素的局域变量
2,把时间标记转换成数字:
shijianyuansu = shijianchuli(shijianyuansu); //"shijianchuli"是一个自定义把时间转化成相应数字的函数,我一会儿再讲
OK,经过处理后,我们就可以通过以下代码把时间和内容赋予早在“系统代码初始化”中就定义好的"shijian_array"和"neirong_array"两个数组中了:
shijian_array.push(shijianyuansu);
neirong_array.push(neirongyuansu);
②上面是通过一句示例歌词说明问题,下面我们对所有歌词进行类似操作:
for (var i = 0; i<jieyageci_array.length; i++) {
//用一个临时的数组储存解压之后单行歌词拆分而成的时间和内容
var danhanggeci_array = jieyageci_array[i].split("]");
//——————分离时间和歌词元素
//删除时间元素中的“[”
var shijianyuansu = danhanggeci_array[0].substring(1);
//格式化时间元素
shijianyuansu = shijianchuli(shijianyuansu);
//内容元素
var neirongyuansu = danhanggeci_array[1];
//将时间和内容赋予数组,如果内容为空,则不记入数组
shijian_array.push(shijianyuansu);
neirong_array.push(neirongyuansu);
}
}
嘿嘿,怎么样,是不是很简单?不过先别着急,我们还有点地方需要再完美一点,我们看看上一节中的歌词,倒数后五条是没用的信息,不需要记入数组,没用不说,还浪费内存,所以通过下面的代码将其屏蔽掉:
if (isNaN(shijianyuansu)) {
break;
}
这段代码的作用就是,当发现时间元素的数据类型不为数字时,就退出循环,需要注意的是这段代码必须放在“将时间和内容赋予数组”的语句之前。
③我们把最终的代码封装到"fenli"函数中,代码如下:
复制内容到剪贴板
代码:
//——————分离歌词为时间和内容,并格式化歌词时间
function fenli() {
for (var i = 0; i<jieyageci_array.length; i++) {
//用一个临时的数组储存解压之后单行歌词拆分而成的时间和内容
var danhanggeci_array = jieyageci_array[i].split("]");
//——————分离时间和歌词元素
//删除时间元素中的“[”
var shijianyuansu = danhanggeci_array[0].substring(1);
//格式化时间元素
shijianyuansu = shijianchuli(shijianyuansu);
//内容元素
var neirongyuansu = danhanggeci_array[1];
//删除多余的说明信息,根据时间元素是否为
if (isNaN(shijianyuansu)) {
break;
}
//将时间和内容赋予数组,如果内容为空,则不记入数组
shijian_array.push(shijianyuansu);
neirong_array.push(neirongyuansu);
}
//删除不用的数组,释放内存
delete geci_array;
delete jieyageci_array;
//在右下文本框显示分离后的歌词
for (var i = 0; i<shijian_array.length; i++) {
//现在不用再解释了吧:)
fenligeci_txt.text += shijian_array[i]+":"+neirong_array[i]+"<br>";
}
}④时间处理函数。
刚才为了连贯性,把时间处理函数跳了过去,现在回来解释一下。我们可以很明显的看到,LRC的歌词时间标记采用的是分秒形式,但秒精确到了小数点后两位。于是我们可以用下面的公式把时间统一用秒计算:总秒数=分*60+秒,按照这个思路我们来定义"shijianchuli"函数:
//时间元素处理函数,将歌词中的时间转换成以秒计算的数字
function shijianchuli(shijian_fc) {
var shijian = shijian_fc.split(":");
return parseInt(shijian[0])*60+parseFloat(shijian[1]);
}
⑤调用"fenli"函数后,右下文本框显示的歌词:
复制内容到剪贴板
代码:
2:词/曲:周杰伦
5.49:歌词吾爱
9.48:http://www.51lrc.com
15.84:难过 是因为闷了很久
21.18:是因为想了太多
24.91:是心理起了作用
30.89:你说 苦笑常常陪着你
36.13:在一起有点勉强
39.83:该不该现在休了我
44.86:不想太多
47.41:我想一定是我听错弄错搞错
53.28:拜托 我想是你的脑袋有问题
60.11:随便说说
62.47:其实我早已经猜透看透不想多说
69.94:只是我怕眼泪撑不住
75.77:不懂 你的黑色幽默
83.25:想通 却又再考倒我
90.63:说散 你想很久了吧?
97.72:我不想拆穿你
105.85:当作 是你开的玩笑
113.22:想通 却又再考倒我
120.76:说散 你想很久了吧?
127.79:败给你的黑色幽默
165.62:不想太多
167.71:我想一定是我听错弄错搞错
173.55:拜托 我想是你的脑袋有问题
180.53:随便说说
184.49:其实我早已经猜透看透不想多说
192.19:只是我怕眼泪撑不住
196.31:不懂 你的黑色幽默
203.51:想通 却又再考倒我
210.61:说散 你想很久了吧?
217.92:我不想拆穿你
226.16:当作 是你开的玩笑
233.54:想通 却又再考倒我
241.06:说散 你想很久了吧?
247.94:败给你的黑色幽默
256.74:说散 你想很久了吧?
263.15:我的认真败给黑色幽默你会发现,不但删除了多余信息,而且时间也都被转换成了以秒计的数字。