Регулярное выражение и создание подстроки для времени - PullRequest
0 голосов
/ 07 февраля 2012

Мне нужен обычный формат времени HH: MM am / pm. Я нашел что-то вроде

$time = "HH:MM am";
preg_match('/[\s0]*(\d|1[0-2]):(\d{2})\s*([AaPp][Mm])/xms', $time, $match);    
$h = $match[1];    
$m = $match[2];    
$a = $match[3];

Есть много регулярных выражений для времени. Но то, что я ищу, это если кто-то напишет aa: mn jk вместо числа, тогда он должен дать $ h = aa $ m = mn и $ a = jk. Или если кто-то оставит их пустыми или частично заполненными, как abcd, то $ h = abcd $ m = ноль и $ a = ноль.

Я решил это, используя цикл for, а некоторые если иное, но надеюсь, что некоторые могут помочь мне сделать это с помощью регулярного выражения или с помощью некоторой функции PHP.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Вам понадобится регулярное выражение, как это ~^(\d{1,2})((?::)(\d{1,2}))?(\s+(am|pm))?$~i

Весь тестовый код будет:

<?php

$regexp = '~^(\d{1,2})((?::)(\d{1,2}))?(\s+(am|pm))?$~i';
$tests = array(
    '18',
    '18:00',
    '7:03 pm',
    '7 pm'
);
$match = array();

foreach( $tests as $test){
    preg_match( $regexp, $test, $match);
    print_r( $match);
}

И результаты:

Array
(
    [0] => 18
    [1] => 18
)
Array
(
    [0] => 18:00
    [1] => 18
    [2] => :00
    [3] => 00
)
Array
(
    [0] => 7:03 pm
    [1] => 7
    [2] => :03
    [3] => 03
    [4] =>  pm
    [5] => pm
)
Array
(
    [0] => 7 am
    [1] => 7
    [2] => 
    [3] => 
    [4] =>  am
    [5] => am
)

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

$hours = isset( $match[1]) ? $match[1] : '00';
$minutes = isset( $match[3]) ? $match[3] : '00';
$am = isset( $match[5]) ? $match[5] : 'am';

Если вам нужно что-то объяснить, пожалуйста, спросите в комментарии

0 голосов
/ 07 февраля 2012

Вы были очень расплывчаты в своих требованиях, поэтому я не знаю, что именно вы пытаетесь сопоставить, но это будет соответствовать любому количеству не : символов и добавит его в $h, после чего следуетнеобязательные : и непробельные символы, которые будут вставлены в $m, за которыми следует необязательный 0 или более пробелов, а оставшиеся символы будут помещены в $a:

if (!preg_match('/^([^:]+)(:(\S+))?(\s*(.+))?$/i', $input, $matches)) {
    // pattern did not match
}

$h = $matches[1];
$m = $matches[3] ?: NULL;
$a = $matches[5] ?: NULL;
0 голосов
/ 07 февраля 2012

Использование Regex может быть немного излишним.Вместо этого используйте функцию explode().

<?php
$str = 'aa:bb cc'; // or 'abcd'
$a = explode(':', $str);
$b = isset($a[1]) ? explode(' ', $a[1]) : NULL;
$h = $a[0];
$m = isset($b[0]) ? $b[0] : NULL;
$a = isset($b[1]) ? $b[1] : NULL;
var_dump($h, $m, $a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...