2012-02-07 4 views
0

Мне нужен регулярный формат времени 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 = null и $ a = null.

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

+0

так что вы хотите, чтобы регулярное выражение, чтобы вернуть части, когда кто-то входит в буквах вместо цифр? что означает '\ w' вместо' \ d'? –

ответ

0

Использование 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); 
+0

Кемаль Фадилла, спасибо за ваш ответ. Это то, что я искал. Просто отлично работает для меня. Еще раз спасибо. –

1

Вы будете нуждаться в регулярных выражениях, как этот ~^(\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

Благодарим вас за помощь. Я новый ученик, поэтому ответ Кемаля Фадиллы кажется мне легче понять. Но ваш код отлично работает. –

0

Вы были очень смутное представление о ваших требований, так что я не знаю, что вы пытаетесь соответствовать, но это будет соответствовать любому числу лиц, не являющихся : символов и вставить его в $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; 
Смежные вопросы