我知道有类似的问题,(这个"如何在正则表达式中使用变量?“似乎很接近),但我想知道(最好的方法)如何解决my问题。
我定义了一些模式,用于检测一些文件名( MP3和其他音频文件)中的艺术家和标题。它类似于MP3tag (一个著名的MP3应用程序)将文件名转换为MP3标记的方式。怎么做?
下面是一个小测试应用程序。(阴性病例消失了,但你掌握了。)
<?php
define('SEARCHPATTERNS', array(
'%track%. %artist% - %title%',
'%track% - %artist% - %title%',
'%track%. %title%',
'%track% - %title%',
'%title%'));
define('UNKNOWN_ARTIST_TITLE_ARRAY', array('?', '?'));
$fileNames = array(
'0780. Janis Joplin - Mercedes Benz.mp3',
'0780. Janis Joplin - Mercedes Benz.flac',
'0780 - Janis Joplin - Mercedes Benz.mp3',
'0780 - Janis Joplin - Mercedes Benz.flac',
'0780. Mercedes Benz.mp3',
'0780. Mercedes Benz.flac',
'0780 - Mercedes Benz.mp3',
'0780 - Mercedes Benz.flac',
'Mercedes Benz.mp3',
'Mercedes Benz.flac',
);
//Test some file names
foreach($fileNames as $fileName)
{
$titleAndArtist = GetTitleArtistUsingSearchPattern($fileName);
var_dump($titleAndArtist);
}
function GetTitleArtistUsingSearchPattern($fileName)
{
foreach(SEARCHPATTERNS as $pattern)
{
$artist = '???????????'; // Get it from fileName if it matches the pattern, but how?
$title = '???????????'; // Get it from fileName if it matches the pattern, but how?
if(true) // If is matches.... How?
{
return array(
empty($artist) ? UNKNOWN_ARTIST_TITLE_STRINGS[0] : $artist,
empty($title) ? UNKNOWN_ARTIST_TITLE_STRINGS[1] : $title
);
}
}
return UNKNOWN_ARTIST_TITLE_ARRAY;
}
?>我确信我必须使用正则表达式搜索(regex)。我现在想不清楚(多亏了科洛娜)。请帮帮我。非常感谢!
发布于 2020-06-09 12:15:49
我以前做过这样的事情,因为一个剧本帮助我标记了我的音乐收藏。我用的是命名捕获组。
您只需定义与结构内文件的不同部分相匹配的模式:(?P<name>pattern)。其中name是描述模式的标记。
示例:
$patterns = [
//This will match `00. artist - title.ext`
'/(?P<track>[0-9]{2})\.\s(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i',
//This will match `00. title.ext`
'/(?P<track>[0-9]{2})\.\s(?P<title>.+)\.([a-z0-9]{3,4})/i',
//This will match `artist - album - 00 title.ext`
'/(?P<artist>.+)\s-\s(?P<album>.+)\s-\s(?P<track>[0-9]{2})\s(?P<title>.+)\.[a-z0-9]{3,4}/i'
// and so on...
];
$filename = "01. Cool Band - Song Title.flac";
$matches = [];
foreach($patterns as $pattern) {
preg_match($pattern, $filename, $matches);
//Matched artist?
$artist = $matches['artist'] ?? false;
//Matched song title?
$title = $matches['title'] ?? false;
//Matched album?
$album = $matches['album'] ?? false;
//etc...
}发布于 2020-06-14 21:52:14
解决办法基本上是大卫·戈麦斯的建议。就像一种魅力。我无法想象他们对这个特殊问题还有很多其他好的解决办法。下面是我的实现(类的一部分):
private function GetTrackInfoFromFileName($fileName, &$item, $defaultValue = '?')
{
$patterns = array(
'/(?P<track>\d{1,4})\.\s(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `0000. artist - title.ext`
'/(?P<track>\d{1,4})\s-\s(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `0000 - artist - title.ext`
'/(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `artist - title.ext`
'/(?P<track>\d{1,4})\.\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `0000. title.ext`
);
$matches = [];
foreach($patterns as $pattern)
{
preg_match($pattern, $fileName, $matches);
if(empty($matches))
{
continue;
}
$item['artist'] = $matches['artist'] ?? $defaultValue;
$item['title'] = $matches['title'] ?? $defaultValue;
$item['track'] = isset($matches['track']) ? array($matches['track']) : array($defaultValue);
return;
}
}https://stackoverflow.com/questions/62280886
复制相似问题