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—) или конец строки ($).
$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 — Барух Гольдштейн совершил теракт в пещере Патриархов
)