PHP - удалить в субтитре целую строку, содержащую с указанием c слово - PullRequest
2 голосов
/ 26 мая 2020

У меня есть наборы определенных c слов, которые я хочу обнаружить в субтитрах, а затем удалить всю строку с помощью регулярного выражения:

$forbiddenWords = [
    'Ads',
    'Download',
    //
];

$file = file_get_contents('example.srt');

foreach ($forbiddenWords as $word) {
    $file .= preg_replace("/\d{3}(?!.*?-)[\s\S]*?$word\[\s\S]*?(?=\d)/", '', $file);
}

Строки субтитров:

1
00:00:39,243 --> 00:00:45,820
This line is ok

2
00:00:46,243 --> 00:00:51,820
This line with
"Ads" word should be deleted
and next line

3
00:01:04,243 --> 00:01:05,820
This line with
"Download" word should be deleted
and next line

4
00:01:08,664 --> 00:01:12,331
An ok line

Результат, который я хочу:

1
00:00:39,243 --> 00:00:45,820
This line is ok

2
00:00:46,243 --> 00:00:51,820


3
00:01:04,243 --> 00:01:05,820


4
00:01:08,664 --> 00:01:12,331
An ok line

Мое регулярное выражение не работает, и оно захватывает несколько строк DEMO REGEX

1 Ответ

1 голос
/ 26 мая 2020

Вы можете использовать

preg_replace('~^(\d+\R(\d{2}:\d{2}:\d{2},\d{3}) --> (?2))(?:\R(?!(?1)).*)*?\b(?:Download|Ads)\b[\s\S]*?(?=\s*(?:(?1)|\z))~mu', '$1', $text)

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки (из-за флага m)
  • (\d+\R(\d{2}:\d{2}:\d{2},\d{3}) --> (?2)) - Группа 1 (идентификатор субтитра + строка промежутка времени):
    • \d+ - 1+ цифр
    • \R - последовательность символов разрыва строки
    • (\d{2}:\d{2}:\d{2},\d{3}) - Группа 2 (метка времени): 2 цифры, :, 2 цифры, :, 2 цифры, запятая, три цифры
    • --> - буквальная строка
    • (?2) - шаблон временной метки
  • (?:\R(?!(?1)).*)*? - любой 0 или больше (но как можно меньше) строки, которые не начинаются с идентификатора субтитра + временного интервала
  • \b(?:Download|Ads)\b - целое слово Download или Ads (при необходимости добавьте больше)
  • [\s\S]*?(?=\s*(?:(?1)|\z)) - любой 0 или больше символов как можно меньше, вплоть до первого появления 0+ пробелов, за которым следует шаблон временного интервала или конец всей строки.
...