PHP парсинг текста между числами с помощью регулярного выражения

Делаю парсинг текста. Текст представляет из себя даты и описание даты. Мне нужно получить каждую дату с описанием в отдельности, чтобы их потом отформатировать.

Код с исходным текстом такой:

$c = '1977 — пожар в московской гостинице «Россия», в результате которого погибло 42 человека 1992 — создано Российское космическое агентство 1994 — Барух Гольдштейн совершил теракт в пещере Патриархов';
preg_match_all('/\d+\s—\D+/',$c, $matches);
print_r($matches);

Шаблон /\d+\s—\D+/ делает почти то, что нужно, но если в описании даты встречается число, то текст обрезается. Помогите написать правильно регулярное выражение, чтобы выбрать из текста в массив строки, начиная с даты, т.е. print_r должен вернуть:

Array
(
    [0] => Array
        (
            [0] => 1977 — пожар в московской гостинице «Россия», в результате которого погибло 42 человека
            [1] => 1994 — Барух Гольдштейн совершил теракт в пещере Патриархов
)
)

Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

/\b\d{4}\s—.*?(?=\s+\d{4}\s—|$)/su

См. пример работы регулярного выражения.

Подробности:

  • \b - граница слова
  • \d{4} - четыре цифры
  • \s - пробельный символ
  • - символ
  • .*? - ноль и более любых символов, как можно меньше
  • (?=\s+\d{4}\s—|$) - позиция в строке, сразу после которой следуют один и более пробельных символов, четыре цифры и тире (\s+\d{4}\s—) или конец строки ($).

Пример работы кода на PHP:

$re = '/\b\d{4}\s—.*?(?=\s+\d{4}\s—|$)/su';
$str = '1977 — пожар в московской гостинице «Россия», в результате которого погибло 42 человека 1992 — создано Российское космическое агентство 1994 — Барух Гольдштейн совершил теракт в пещере Патриархов';
preg_match_all($re, $str, $matches);
print_r($matches[0]);

Результат:

Array
(
    [0] => 1977 — пожар в московской гостинице «Россия», в результате которого погибло 42 человека
    [1] => 1992 — создано Российское космическое агентство
    [2] => 1994 — Барух Гольдштейн совершил теракт в пещере Патриархов
)
→ Ссылка