快速业务通道

用flash实现基于搜索引擎的搜索 - 本地直接从百度获取LRC歌词

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-08
:") 对它进行验证,在这里我只验证两个字符:在它前面3个字符的"." 和 在它前面6个字符的":"。你可以加上验证在它前面9个字符的"["来加强验证。代码是:

if (htmlData.slice(lastIndex-3, lastIndex-2) == "." && htmlData.slice(lastIndex-6, lastIndex-5) == ":" && htmlData.slice(lastIndex-9, lastIndex-8) == "[")

如果验证失败(也就是说它不是我们想找的像"[00:30.11]"这样的标签),我们将再向前搜索直到找到这个标签为止,跳到else部份:
else {
htmlData = htmlData.slice(0, lastIndex);
......
findEndTag();
}
}
htmlData = htmlData.slice(0, lastIndex) 截取在找到的"]"这个字符之前的内容用作以后的处理,findEndTag() 使它继续重复上面查找验证的工作。
注意,findEndTag()运行了它自已身,我们的整个查找验证的函数实际上是一个自循环(自已在函数内部调用自已)。
flash中一个函数递归256次的限制。也就是一个函数不能重复执行256次。超过256次 flash 就将终止它并可能停止执行所有的ActionScript(接近于程序崩溃了)
这里我们自行加了一个计数器判断将执行次数限制在256次以内以免到时flashPlayer终止它让你的程序崩溃。
if (loopStart == undefined) {
loopCount = 1;
} else {
delete loopStart;
}
if (loopCount<254) {
loopStart = true;
loopCount++;
这里用了一个一个相互排斥的锁定的方法以使函数明白自已是不是第一次执行。如果是,则重新开始计数。如果不是,则将计数器累加,并将次数限制在规定次数以内。

自循环函数是比较危险的,如果不是必要,请尽量少使用它。(或者用两个AB相同的函数交叉调用代替,但也请注意别让函数陷在死循环里跳不出来,极度危险。更好的解决方案是将函数的执行放在onEnterFrame事件中,但可能会牺牲点执行速度,写法如下:)
function findEndTag() {
this.onEnterFrame=function(){
var lastIndex = htmlData.lastIndexOf("]");
if (htmlData.slice(lastIndex-3, lastIndex-2) == "." && htmlData.slice(lastIndex-6, lastIndex-5) == ":") {
var tmpBR = htmlData.slice(lastIndex);
htmlData = htmlData.slice(0, lastIndex+tmpBR.indexOf("<br")+3);
htmlData = htmlData.slice(0, htmlData.indexOf("</"));
delete this.onEnterFrame;
doFunction();
} else {
htmlData = htmlData.slice(0, lastIndex);
}
}
}

我们回到验证成功后的部份:
var tmpBR = htmlData.slice(lastIndex);
htmlData = htmlData.slice(0, lastIndex+tmpBR.indexOf("<br")+3);
htmlData = htmlData.slice(0, htmlData.indexOf("</"));
我们只过滤掉我们不想要的部份,注意,不是从"]"这个字符串的位置过滤,这样你将丢掉最后一行歌词的内容。我们查找最靠近这一行歌词的源代码标签(这里我们开始要用到源代码来识别了)"<br"方法是将"]"之后的内容截成一个临时的字符串并查找它的第一个位置,然后将它和前面的"]"位置累加得到最终的这个截取点。
因为有些歌词的旁边并没有"<br" 标签,它可能放在一个容器中(如文本框或者最后没有"<br"结尾的表格),所我们加上这一句:htmlData = htmlData.slice(0, htmlData.indexOf("</"))
用高级的查找方式(加个起始位置参数)你也可以将上面的代码直接写成这样:
htmlData = htmlData.slice(0, htmlData.indexOf("<br",lastIndex)+3);
htmlData = htmlData.slice(0, htmlData.indexOf("</"));

最后我们回到这里:
htmlData = htmlData.split("<br>").join("\n");
htmlData = htmlData.split("<br />").join("\n");
lrcData = htmlData.split(String.fromCharCode(10)).join("");
看看最后我们得到的LRC歌词内容,它大致是下面

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号