Как вырезать название файла и разбить на переменные через регулярные выражения?

Всем привет. У меня не совсем стандартная задача по регуляркам. В регулярках нуб, по этому прошу помощи. Имеются названия файлов:

02. ГудВин[Герои Комиксов] — Орут сирены(фристайл)
12. Стильный Билли feat. aka Ахмед — Чисто ё (Стильный Билли prod.)
04.Nuttkase feat. Птаха — Если Друг (Хасол-Версия) (Phunk Masta Seven prod.)
02.Dr.MokRolog,Old Primus,JustSmile,Vine Bi — Электрограч (Pro100 Beatz prod.)

Необходимо вырезать из загружаемого файла название и с помощью регулярных выражений его обрезать по следующему сценарию:

  1. Если название начинается на «01.» (цифры и точка, вырезаем их)
  2. Берём содержимое до пробела и до дефиса " -", это сохраняем в поле artist

  3. Берём содержимое после дефиса и пробела "- ", сохраняем это в поле name
  4. После названия в большинстве случаев идут либо скобки "( )", либо квадратные скобки "[ ]", а иногда скобки повторяются. Возможно ли в таком варианте первые закрывающиеся скобки добавлять к имени файла, а последние брать и вставлять в поле beatmaker?!
Тоесть на выходе должны иметь

$artist = 'Стильный Билли';
$feat = 'aka Ахмед';
$name = 'Чисто ё';
$beatmaker = 'Стильный Билли';
вот так

$artist = 'Nuttkase';
$feat = 'Птаха';
$name = 'Если Друг (Хасол-Версия)';
$beatmaker = 'Phunk Masta Seven';
и вот так

$artist = 'Dr.MokRolog';
$feat = 'Old Primus,JustSmile,Vine Bi';
$name = 'Электрограч';
$beatmaker = 'Pro100 Beatz';
UPD: Обновил регулярку regex101.com/r/AD860D/2 сейчас то что надо, только не вырезается prod.
SEQUEL.ONE
21 июня 2020, 23:15
modx.pro
1
135
+1

Комментарии: 4

SEQUEL.ONE
22 июня 2020, 00:20
0
Начало положено. Такой регуляркой можно вырезать цифры с точкой от начала:

^\K\d{2,}.
Потом, видимо, использовать PHP функцию типа trim, удаляющую пробел справа в начале и можем работать дальше с такими записями:

ГудВин[Герои Комиксов] — Орут сирены(фристайл)
Стильный Билли feat. aka Ахмед — Чисто ё (Стильный Билли prod.)
Nuttkase feat. Птаха — Если Друг (Хасол-Версия) (Phunk Masta Seven prod.)
Dr.MokRolog,Old Primus,JustSmile,Vine Bi — Электрограч (Pro100 Beatz prod.)
    SEQUEL.ONE
    22 июня 2020, 00:22
    0
    Осталось разобраться как теперь из этого вырезать нужное.
    SEQUEL.ONE
    22 июня 2020, 01:26
    +1
    Вроде бы так должно работать.
    function parseTrack($str) {
        [$first_part, $second_part] = explode(' - ', $str); 
        $first_part = preg_replace('~^\d+\. ?~', '', $first_part); 
    
        [$artist, $feat] = explode(' feat. ', $first_part);
        $feat = !empty($feat) ? explode(',', $feat) : null; 
    
        preg_match('~^(.*?)(?: \(([^(]+) prod.\))?$~', $second_part, $match);
        return [
            'artist' => $artist, 
            'feat' => $feat, 
            'name' => $match[1],
            'beatmaker' => isset($match[2]) ? $match[2] : null
        ];
    }
      SEQUEL.ONE
      22 июня 2020, 10:27
      0
      Проверил работу функции вроде бы хорошо подставляются данные в поля Артист и Участники, но вот в поле beatmaker ничего не подставляется, а в поле Название добавляется битмейкер со скобками:

      43 (Павел Underground prod)
      Нужно чтобы в поле name битмейкер в скобках не подставлялся. А в поле beatmaker должен добавляться только битмейкер без скобок.

      Можно это как-то пофиксить?
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4