Этот код, чтобы получить все последовательности из 8 целых чисел работает нормально:
preg_match_all('/[0-9]{8}/', $string, $match);
Однако мне интересно только, если матч начнется с 20.
Я знаю, что должен добавить ^20
где-то, но я пытался много раз безуспешно. Я посмотрел много уроков по регулярным выражениям, но ни один из них не объясняет, как выполнить 2 отдельных поиска.
Я на самом деле пытаюсь разобрать файлы ICAL, чтобы извлечь даты. Если 8-значное целое число начинается с 20, это почти наверняка дата.
Например: DTSTART:20150112T120000Z
Как насчет этого решения:
/(20)\d{6}/
Это, вероятно, найдет то, что вы ищете:
(?=20)(\d{8})
Это делает позитивный взгляд, чтобы захватить группу, если она начинается с 20
вместе с 8-значным числом.
Ответ сильно зависит от того, чего вы хотите достичь. Вы хотите извлечь все и любые даты из файла icalendar. Если это так, вы можете пропустить даты рождения, так как их год, скорее всего, начинается с 19xx.
Также сопоставление с любыми датами, скорее всего, приведет ко многим нежелательным UNTIL
, TRIGGER
, DTEND
…
Предполагая, что из вашего примера вы хотите извлечь даты начала событий, вы можете попробовать:
DTSTART[a-zA-Z._%+-/=;]*:(\d){8}[T]?[\d]{6}
Следует иметь в виду: следующее DTSTART
может быть определение часового пояса, как TZID=America/New_York
и / или определение типа DATE
или же DATE-TIME
(увидеть RFC5545 ДАТА-ВРЕМЯ