Подтвердить что ты не робот

Что такое шаблон регулярного выражения для datetime (2008-09-01 12:35:45)?

Что такое шаблон RegEx для DateTime (2008-09-01 12:35:45)?

Я получаю эту ошибку:

Нет окончательного разделителя '^' found

Использование:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

Дает эту ошибку:

Предупреждение: preg_match() [function.preg-match]: Ошибка компиляции: ничего не повторять со смещением 0 в E:\www\index.php в строке 19

4b9b3361

Ответ 1

@Espo: Я просто должен сказать, что регулярное выражение невероятно. Мне не хотелось бы писать код, который делал что-то полезное в матчах, например, если вы действительно хотите узнать, какую дату и время пользователь набрал.

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

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

Если вы используете perl, вы можете получить значения с помощью чего-то вроде этого:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

Другие языки будут иметь схожие возможности. Обратите внимание, что для регулярного выражения вам нужно будет сделать несколько второстепенных модов, если вы хотите принимать такие значения, как однозначные месяцы.

Ответ 2

Простая версия, которая будет работать в указанном формате, но не все остальные в соответствии с @Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

Ответ 3

http://regexlib.com/REDetails.aspx?regexp_id=610

^ (=\d?) (:(?: 31 ((?: 0 [2469] | 11)) | (:?!.??!.? 30 | 29) (0 2) | 29 (= 0 2 (:(:(?: 1 [6-9] |?.?.? [2-9]\г) (0?: [48] |? [2468] [048] | [ 13579] [26]) | (:(?: 16 | [2468] [048] | [3579] [26]) 00))) (?:\x20 | $)) | (:? 2 [0- 8] | 1\д | 0 [1-9])) ([-/]) (?: 1 [012] | 0 [1-9])\1 (:?.? 1 [6-9] | [2-9]\d)\d\d ((=\x20\d?)\x20 | $)) (((0 [1-9] | 1 [012]?) (?: [0-5]\г) {0,2} (\ х20 [П.] М)) | ([01]\д | 2 [0-3]) (: [0-5]\г) {1, 2})? $


Этот RE подтверждает как даты, так и/или временные шаблоны. Дни в феврале также утвержденный для високосных лет. Даты: в dd/mm/yyyy или d/m/yy между 1/1/1600 - 31/12/9999. Ведущие нули являются необязательными. Сепараторы даты могут быть либо совпадающие черты (-), косые черты (/) или периоды (.) Времена: в hh: MM: ss AM/PM 12-часовой формат (12:00 AM - 11:59:59 PM) или hh: MM: ss военное время формат (00:00:00 - 23:59:59). 12 часовой формат времени: 1) может иметь ведущий ноль в течение часа. 2 минуты и секунды являются необязательными для 12 часовой формат 3) требуется AM или PM и чувствительность к регистру. Военное время 1) должен иметь начальный ноль за все часы менее 10. 2) Протокол manditory. 3) секунды являются необязательными. Datetimes: сочетание вышеперечисленного форматы. Сначала датируется дата разделенных пробелом. ex) dd/mm/yyyy чч: мм: сс


Изменить. Обязательно скопируйте RegEx с сайта regexlib.com, поскольку StackOverflow иногда удаляет/уничтожает специальные символы.

Ответ 4

$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$будут:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

Простой способ разбить стробированную строку datetime.

Ответ 5

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$

Ответ 7

относительно ответа Имрана от 1 сентября 2008 года в 12:33 отсутствует: в шаблоне правильные шаблоны

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

это возвращает

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

Ответ 8

Вот мое решение:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

Ответ 10

Я изменил шаблон регулярного выражения из http://regexlib.com/REDetails.aspx?regexp_id=610. Следующий шаблон должен соответствовать вашему случаю.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

ГГГГ-ММ-ДД ЧЧ: ММ: СС

Ответ 11

Функции PHP preg требуют, чтобы ваше регулярное выражение было обернуто символом-разделителем, который может быть любым символом. Вы не можете использовать этот символ разделителя, не выходя из регулярного выражения. Это должно работать (здесь символ разделителя есть /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

Если вам нужно сопоставить строки, содержащие только дату и время, добавьте ^ и $в начало и конец регулярного выражения.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Ссылка на PHP-руководство preg_match()

Ответ 12

Вот упрощенная версия (возникла из ответа Espo). Он проверяет правильность даты (даже високосный год), а hh: mm: ss необязательно
Примеры работы:
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$