将文本格式的歌词处理为HTML格式的文本歌词
时间:2023年10月04日
/来源:网络
/编辑:佚名
需要转化的歌词:
[01:04.81] 你好
[02:57.54][00:42.86]真情像草原广阔
[03:04.81][00:50.07]层层风雨不能阻隔
[05:04.81] 叼毛
转换后的效果:
<p data-time="01:04.81">你好</p>
<p data-time="00:42.86">真情像草原广阔</p>
<p data-time="00:50.07">层层风雨不能阻隔</p>
<p data-time="02:57.54">真情像草原广阔</p>
<p data-time="03:04.81">层层风雨不能阻隔</p>
<p data-time="05:04.81">叼毛</p>
尝试了许许多多的办法,反正正则够呛!
最后还是依靠foreach循环+正则匹配来实现,绞尽脑汁,写了一天!
最开始的代码为:
<?php
// 假设歌词文本保存在 $lyrics 变量中
// 正则匹配出所有时间戳,并将它们以升序排列
preg_match_all('/\[(\d{2}:\d{2}\.\d{2})\]/', $lyrics, $matches);
$timestamps = $matches[1];
sort($timestamps);
// 根据时间戳将歌词内容拆分成数组
$lyric_lines = preg_split('/\[\d{2}:\d{2}\.\d{2}\]/', $lyrics);
array_shift($lyric_lines);
// 将时间戳和歌词内容对应起来,输出 HTML 标签
for ($i = 0; $i < count($timestamps); $i++) {
$time = $timestamps[$i];
$lyric = trim($lyric_lines[$i]);
echo '<p data-time="' . $time . '">' . $lyric . '</p>';
}
?>
但有一个问题,如果歌词文本里面有两个时间[03:04.81][00:50.07],那么就会出现不好的情况,匹配出问题!
而且有些歌词里面不止一个这种时间,所以正则的话,还需要多次处理才行!
由于无法预判出现时间的次数和歌词循环的次数,所以我便利用foreache来实现!
最后的代码为:
public function diaoMaoC($str){
$array = explode("\n",$str);
if(empty($array) || strpos($str,"\n") === false){
return $this->diaoMaoLyric($str);
}else{
foreach ($array as $v){
preg_match_all('/\[(\d{2}:\d{2}(.\d{2,})?)\]/',$v,$matchs);
if(!empty($matchs[1])){
foreach ($matchs[1] as $v2){
$timeData[] = $v2;
}
}else{
return $this->diaoMaoLyric($str);
}
}
sort($timeData);
foreach ($timeData as $v){
foreach ($array as $v2) {
if (strpos($v2, $v) !== false) {
$html .= '<p data-time="' . $v . '">' . preg_replace('/\[(\d{2}:\d{2}(.\d{2,})?)\]/','',$v2) . '</p>';
break;
}
}
}
return $html;
}
}
public function diaoMaoLyric($str){
// 替换[]内的内容
$str = preg_replace('/\[[^\]]+\]/', '', $str);
// 将换行符替换为中文逗号
$str = str_replace("\n", '</p><p>', $str);
$str = str_replace('\n', '</p><p>', $str);
$str = "<p>".$str."</p>";
$str = str_replace("<p></p>", '', $str);
return $str;
}
[01:04.81] 你好
[02:57.54][00:42.86]真情像草原广阔
[03:04.81][00:50.07]层层风雨不能阻隔
[05:04.81] 叼毛
转换后的效果:
<p data-time="01:04.81">你好</p>
<p data-time="00:42.86">真情像草原广阔</p>
<p data-time="00:50.07">层层风雨不能阻隔</p>
<p data-time="02:57.54">真情像草原广阔</p>
<p data-time="03:04.81">层层风雨不能阻隔</p>
<p data-time="05:04.81">叼毛</p>
尝试了许许多多的办法,反正正则够呛!
最后还是依靠foreach循环+正则匹配来实现,绞尽脑汁,写了一天!
最开始的代码为:
<?php
// 假设歌词文本保存在 $lyrics 变量中
// 正则匹配出所有时间戳,并将它们以升序排列
preg_match_all('/\[(\d{2}:\d{2}\.\d{2})\]/', $lyrics, $matches);
$timestamps = $matches[1];
sort($timestamps);
// 根据时间戳将歌词内容拆分成数组
$lyric_lines = preg_split('/\[\d{2}:\d{2}\.\d{2}\]/', $lyrics);
array_shift($lyric_lines);
// 将时间戳和歌词内容对应起来,输出 HTML 标签
for ($i = 0; $i < count($timestamps); $i++) {
$time = $timestamps[$i];
$lyric = trim($lyric_lines[$i]);
echo '<p data-time="' . $time . '">' . $lyric . '</p>';
}
?>
但有一个问题,如果歌词文本里面有两个时间[03:04.81][00:50.07],那么就会出现不好的情况,匹配出问题!
而且有些歌词里面不止一个这种时间,所以正则的话,还需要多次处理才行!
由于无法预判出现时间的次数和歌词循环的次数,所以我便利用foreache来实现!
最后的代码为:
public function diaoMaoC($str){
$array = explode("\n",$str);
if(empty($array) || strpos($str,"\n") === false){
return $this->diaoMaoLyric($str);
}else{
foreach ($array as $v){
preg_match_all('/\[(\d{2}:\d{2}(.\d{2,})?)\]/',$v,$matchs);
if(!empty($matchs[1])){
foreach ($matchs[1] as $v2){
$timeData[] = $v2;
}
}else{
return $this->diaoMaoLyric($str);
}
}
sort($timeData);
foreach ($timeData as $v){
foreach ($array as $v2) {
if (strpos($v2, $v) !== false) {
$html .= '<p data-time="' . $v . '">' . preg_replace('/\[(\d{2}:\d{2}(.\d{2,})?)\]/','',$v2) . '</p>';
break;
}
}
}
return $html;
}
}
public function diaoMaoLyric($str){
// 替换[]内的内容
$str = preg_replace('/\[[^\]]+\]/', '', $str);
// 将换行符替换为中文逗号
$str = str_replace("\n", '</p><p>', $str);
$str = str_replace('\n', '</p><p>', $str);
$str = "<p>".$str."</p>";
$str = str_replace("<p></p>", '', $str);
return $str;
}
新闻资讯 更多
- 【建站知识】查询nginx日志状态码大于400的请求并打印整行04-03
- 【建站知识】Python中的logger和handler到底是个什么?04-03
- 【建站知识】python3拉勾网爬虫之(您操作太频繁,请稍后访问)04-03
- 【建站知识】xpath 获取meta里的keywords及description的方法04-03
- 【建站知识】python向上取整以50为界04-03
- 【建站知识】scrapy xpath遇见乱码解决04-03
- 【建站知识】scrapy爬取后中文乱码,解决word转为html 时cp1252编码问题04-03
- 【建站知识】scrapy采集—爬取中文乱码,gb2312转为utf-804-03