我正在尝试将文件名拆分为3个部分。
示例:艺术家 - 标题(混音)或艺术家 - 标题[混音]
到目前为止我的代码。
preg_match('/^(.*) - (.*)\.mp3$/', $mp3, $matches);
$artist = $matches[1];
$title = $matches[2];
echo "File: $mp3" . "Artist: $artist" . "\n" . "Title: $title" . "<br />";
这让我成为艺术家和头衔。我遇到的问题是Mix在()或[]之间。我不确定如何修改我的正则表达式以捕获该部分。
答案 0 :(得分:1)
这不是100%的正则表达式解决方案,但我认为这是最优雅的。
基本上,您想捕获(anything)
或[anything]
,可以表示为\(.*\)|\[.*\]
。然后,将其设为捕获组,然后双击它,以获得(\\(.*\\)|\\[.*\\])
。
不幸的是,这也捕获了()
或[]
,所以你必须删除它们;我只是用substr($matches[3], 1, -1)
来完成这项工作:
$mp3 = "Jimmy Cross - I Want My Baby Back (Remix).mp3";
preg_match('/^(.*) - (.*) (\\(.*\\)|\\[.*\\])\.mp3$/', $mp3, $matches);
$artist = $matches[1];
$title = $matches[2];
$mix = substr($matches[3], 1, -1);
echo "File: $mp3" . "<br/>" . "Artist: $artist" . "<br/>" . "Title: $title" . "<br />" . "Mix: $mix" . "<br />";
打印出来:
档案:吉米十字架 - 我想要我的宝贝回来(混音).mp3
艺术家:Jimmy Cross
标题:我想要我的宝贝回来 混音:混音
答案 1 :(得分:0)
尝试'/^(.*) - ([^\(\[]*) [\(\[] ([^\)\]]*) [\)\]]\.mp3$/'
但是,这可能不是最有效的方法。
答案 2 :(得分:0)
我会使用命名子模式来处理这种特殊情况。
$mp3s = array(
"Billy May & His Orchestra - T'Ain't What You Do.mp3",
"Shirley Bassey - Love Story [Away Team Mix].mp3",
"Björk - Isobel (Portishead remix).mp3",
"Queen - Another One Bites the Dust (remix).mp3"
);
$pat = '/^(?P<Artist>.+?) - (?P<Title>.*?)( *[\[\(](?P<Mix>.*?)[\]\)])?\.mp3$/';
foreach ($mp3s as $mp3) {
preg_match($pat,$mp3,$res);
foreach ($res as $k => $v) {
if (is_numeric($k)) unset($res[$k]);
// this is for sanitizing the array for the output
}
if (!isset($res['Mix'])) $res['Mix'] = NULL;
// this is for the missing Mix'es
print_r($res);
}
将输出
Array (
[Artist] => Billy May & His Orchestra
[Title] => T'Ain't What You Do
[Mix] =>
)
Array (
[Artist] => Shirley Bassey
[Title] => Love Story
[Mix] => Away Team Mix
)
Array (
[Artist] => Björk
[Title] => Isobel
[Mix] => Portishead remix
)
Array (
[Artist] => Queen
[Title] => Another One Bites the Dust
[Mix] => remix
)