将文本格式的歌词处理为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;
}
猜你需要

豫ICP备2021026617号-1  豫公网安备:41172602000185   Copyright © 2021-2028 www.78moban.com/ All Rights Reserved

本站作品均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如有侵犯您的版权,请联系 1565229909#qq.com(把#改成@),我们将立即处理。