Как вырезать название файла и разбить на переменные через регулярные выражения?
Всем привет. У меня не совсем стандартная задача по регуляркам. В регулярках нуб, по этому прошу помощи. Имеются названия файлов:
02. ГудВин[Герои Комиксов] - Орут сирены(фристайл)
12. Стильный Билли feat. aka Ахмед - Чисто ё (Стильный Билли prod.)
04.Nuttkase feat. Птаха - Если Друг (Хасол-Версия) (Phunk Masta Seven prod.)
02.Dr.MokRolog,Old Primus,JustSmile,Vine Bi - Электрограч (Pro100 Beatz prod.)
Необходимо вырезать из загружаемого файла название и с помощью регулярных выражений его обрезать по следующему сценарию:
- Если название начинается на "01." (цифры и точка, вырезаем их)
- Берём содержимое до пробела и до дефиса " -", это сохраняем в поле artist
- Берём содержимое после дефиса и пробела "- ", сохраняем это в поле name
- После названия в большинстве случаев идут либо скобки "( )", либо квадратные скобки "[ ]", а иногда скобки повторяются. Возможно ли в таком варианте первые закрывающиеся скобки добавлять к имени файла, а последние брать и вставлять в поле 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 покажите сразу как вырезать будет.
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Используйте
^\d+\.\s*(?P<artist>.*?)(?:\bfeat\.?\s*(?P<feat>.*?))?\s+-\s+(?P<name>.*?)\s*\((?P<beatmaker>[^()]*?)(?:\s*prod\.)?\)\s*$
См. пример работы регулярного выражения
Подробности
^- начало строки\d+- 1 и более цифр\.- точка\s*- 0 и более пробельных символов(?P<artist>.*?)- 0 и более любых символов, отличных от перевода строки, как можно меньше(?:\bfeat\.?\s*(?P<feat>.*?))?- необязательная последовательность шаблонов:\bfeat- целое словоfeat\.?- необязательная точка\s*- 0 и более пробельных символов- 0 и более любых символов, отличных от перевода строки, как можно меньше
\s+-\s+- дефис, с обеих сторон которого могут находиться 1 и более пробельных символов(?P<name>.*?)- 0 и более любых символов, отличных от перевода строки, как можно меньше\s*- 0 и более пробельных символов\(- символ((?P<beatmaker>[^()]*?)- 0 и более символов, отличных от(и)(?:\s*prod\.)?\)- - символ)\s*- 0 и более пробельных символов$- конец строки.