将文本格式的歌词处理为HTML格式的文本歌词

需要转化的歌词:

[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;
}

© 版权声明
THE END
喜欢就支持一下吧
点赞6
评论 抢沙发

请登录后发表评论

    暂无评论内容