@sequelone

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

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


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';


Буду признателен, если здесь https://regex101.com/r/AD860D/1 покажите сразу как вырезать будет.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
@StockholmSyndrome
function parseTrack($str) {
    [$first_part, $second_part] = explode(' - ', $str); 
    $first_part = preg_replace('~^\d+\. ?~', '', $first_part); 

    $artists = preg_split('~ feat\. |,~', $first_part);
    $artist = $artists[0];
    $feat = array_slice($artists, 1);

    preg_match('~^(.*?)(?: \(([^(]+) prod\.?\))?$~', $second_part, $match);
    return [
        'artist' => $artist, 
        'feat' => $feat, 
        'name' => $match[1],
        'beatmaker' => isset($match[2]) ? $match[2] : null
    ];
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
/^([\d]+\.)?\s?([^-]+)\s-\s(.+)\((.+)?\)$/img
вроде бы так
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы