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

StackOverflow https://stackoverflow.com/questions/37732

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

(\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;

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

Другие советы

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

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

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] 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 | $))? (((0? [1-9] | 1 [012]) (: [0- 5] d) {0,2} ( x20 [ap] m)) | ([01] d | 2 [0-3]) (: [0-5] d) {1,2}) ? $


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


Редактировать: Убедитесь, что вы скопируете режиму на веб -сайте regexlib.com, так как Stackoverflow иногда удаляет/разрушает специальные Chars.

^([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)$
$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.

Относительно ответа Имрана 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 ) 

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

/^(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

Я изменил шаблон режима из 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})?$

Yyyy-mm-dd HH: MM: SS

Функциям 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');

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

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

Ссылка на PHP Manual's Preg_Match ()

Вот упрощенная версия (возникла из ответа 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})?$

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

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

Debuggex Demo

https://regex101.com/r/lbthat/4

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top