0

ここでは、ファイル名を 3 つの部分に分割しようとしています。

例: アーティスト - タイトル ( Mix ) またはアーティスト - タイトル [ Mix ]

これまでの私のコード。

preg_match('/^(.*) - (.*)\.mp3$/', $mp3, $matches);
$artist = $matches[1];
$title = $matches[2];
echo "File: $mp3" . "Artist: $artist" . "\n" . "Title: $title" . "<br />";

これにより、アーティストとタイトルが取得されます。私が抱えている問題は、Mix が () または [ ] の間にあることです。その部分をキャプチャするために正規表現を変更する方法がわかりません。

4

3 に答える 3

1

これは 100% の正規表現ソリューションではありませんが、最も洗練された方法だと思います。

(anything)基本的に、または[anything]として表すことができるをキャプチャする必要があります\(.*\)|\[.*\]。次に、それをキャプチャ グループにし、ダブル エスケープして を取得します(\\(.*\\)|\\[.*\\])

()残念ながら、これはorもキャプチャする[]ため、それらを削除する必要があります。私は単に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 />";

プリントアウト:

File: Jimmy Cross - I Want My Baby Back (Remix).mp3
アーティスト: Jimmy Cross
タイトル: I Want My Baby Back
ミックス: リミックス

于 2012-12-22T04:05:21.290 に答える
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
)
于 2012-12-22T04:43:58.163 に答える
0

試す'/^(.*) - ([^\(\[]*) [\(\[] ([^\)\]]*) [\)\]]\.mp3$/'

ただし、これは最も効率的な方法ではない可能性があります。

于 2012-12-22T03:52:03.207 に答える