2015-02-06 4 views
0
ческих

Этого кода, чтобы получить все последовательности из 8 целых чисел работает отлично:Extract целого строку 8 символов из файла

preg_match_all('/[0-9]{8}/', $string, $match);

Однако я заинтересован только если матч начинается с 20

Я знаю, что мне нужно добавить ^20, но я пробовал много раз без успеха. Я просмотрел много учебников по регулярному выражению, но ни один из них не объясняет, как сделать 2 отдельных поиска.

Я на самом деле пытаюсь разобрать файлы ICAL, чтобы извлечь даты. Если 8-значное целое число начинается с 20, это почти наверняка дата.

Например: DTSTART:20150112T120000Z

+0

Вы пробовали '(? = 20) (\ d {8})'? – MacMac

ответ

0

Как насчет этого решения:

/(20)\d{6}/ 
+1

Я бы использовал/(20 \ d {6}) /, чтобы получить весь матч вместо 20. – Wieczo

0

Это, вероятно, найти то, что вы ищете:

(?=20)(\d{8}) 

Это означает положительный предпросмотр, чтобы захватить группу если он начинается с 20 вместе с 8-значным номером.

0

Ответ очень зависит от того, чего вы хотите достичь. Вы хотите извлечь все и любые даты из файла icalendar. Если это так, вы можете потерять даты рождения, так как их год, скорее всего, начнется с 19xx.

Также соответствие любых дат будут давать, скорее всего, многие нежелательные даты как UNTIL, TRIGGER, DTEND ...

Предполагая, что из вашего примера вы хотите извлечь событие даты начала, вы можете попробовать:

DTSTART[a-zA-Z._%+-/=;]*:(\d){8}[T]?[\d]{6} 

Чтобы иметь в виду: следующие DTSTART может быть определением часового пояса, как TZID=America/New_York и/или определения типа DATE или DATE-TIME (см RFC5545 DATE-TIME

+0

Спасибо за ответы. Первые 2 ответа идеально подходят для моих нужд, потому что меня интересует только будущее. Это функция я сделал функция extract_numbers ($ строка) { preg_match_all ('/ (201 \ д {5}) /', $ строка, $ совпадение); // Найдите номер, начинающийся с 201, за которым следуют 5 целых чисел return $ match [0]; } –