В моем почтовом клиенте я извлекаю все токены, разделенные пробелами, и затем перебираю их, используя эвристику, чтобы решить, как классифицировать каждый токен. Например, если в токене есть символ «:», я воспринимаю его как время, которое нужно проанализировать как ##: ##: ##. Если есть «.» или '-' рассматривайте это как комбинацию день / месяц / год, и вы должны решить, какой конец какой ... может быть любым количеством комбинаций. Если токен начинается с буквы (то есть isalpha (* string)), тогда вы делаете поиск по названию месяца. Если это число, то это может быть день или год ... определяется исходя из продолжительности, а также, есть ли у вас уже существующий день или год и т. Д. Если токен начинается с '-' или '+', то это часовой пояс, проанализируйте соответственно.
Кажется, что работает в поле довольно хорошо, мой почтовый клиент работает около 10 лет или около того. Мой код на C ++, но вы можете легко написать то же самое на PHP, это не зависит от языка.