Регулярное выражение, необходимое для проверки даты/времени

Мне нужно регулярное выражение PHP 5 для следующего формата даты/времени:

10 июл 2010 15:00

(2 цифры пробел 3 символа пробел 4 цифры пробел 2 цифры двоеточие 2 цифры)

Регистр символов не имеет значения, разрешены только буквы az, 0-9, пробел, двоеточие.

Заранее спасибо.


person MAXIM    schedule 25.07.2010    source источник
comment
звучит как stackoverflow.com/questions/2811535/php-datetime-regex   -  person SteveCav    schedule 26.07.2010
comment
Не совсем. Мне нужно только проверить, что поле находится в этом конкретном формате. Если это так, я конвертирую его в формат, удобный для MYSQL. Если нет, то пользователю отображается ошибка.   -  person MAXIM    schedule 26.07.2010


Ответы (1)


Это точно соответствует вашей спецификации, которая допускает любое значение месяца.

Как видите, я сгруппировал каждую часть даты, чтобы вы могли легко переформатировать ее.

Если строка не совпадает, $m будет равно 0.

linux-t77m:/home/vinko$ more preg.php
<?php
$d = "10 Jul 2010 15:00";
$m = preg_match("/(\d{2})\s([a-z]{3})\s(\d{4})\s(\d{2}):(\d{2})/i",$d,&$matches);
print_r($matches);
?>
linux-t77m:/home/vinko$ php preg.php
Array
(
    [0] => 10 Jul 2010 15:00
    [1] => 10
    [2] => Jul
    [3] => 2010
    [4] => 15
    [5] => 00
)

Чтобы убедиться, что у вас есть только действительные месяцы, вы можете использовать вместо этого регулярное выражение

$m = preg_match("/(\d{2})\s(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s(\d{4})\s(\d{2}):(\d{2})/i",$d,&$matches);

Но... теперь вы сопоставляете только английские месяцы.

Это скоро станет громоздким. Я настоятельно рекомендую вам использовать библиотеку обработки даты и времени и позволить ей обрабатывать все эти проблемы.

person Vinko Vrsalovic    schedule 25.07.2010
comment
Хороший материал, приятель. Это на самом деле подняло очень хороший вопрос - как я могу также убедиться, что месяц является допустимым трехсимвольным названием месяца? - person MAXIM; 26.07.2010
comment
@GSTAR: если строка соответствует регулярному выражению, проверьте месяц по двенадцати возможностям вручную. - person David Z; 26.07.2010
comment
Удачи снова. Я бы использовал этот класс datetime, но он говорит мне, что он включен только в версии 5.3, которую мой хост в настоящее время не предоставляет. Я думаю, что приведенное выше решение, которое вы предоставили, отлично подойдет для меня, я не думаю, что мне все равно понадобится что-то, кроме английских названий месяцев :) - person MAXIM; 26.07.2010
comment
Привет, Винко, как я могу убедиться, что весь шаблон совпадает и что больше нельзя добавить текст после времени (15:00)? С приведенным выше выражением я могу добавить текст после времени, и это не дает ошибки. - person MAXIM; 20.09.2010
comment
@GSTAR: /(\d{2})\s(январь|февраль|март|апрель|май|июнь|июль|август|сен|октябрь|ноябрь|декабрь)\s(\d{4})\s( \d{2}):(\d{2})$/я - person Vinko Vrsalovic; 20.09.2010