PHP проверяет правильный формат времени в $ value - PullRequest
1 голос
/ 23 марта 2012

У меня есть онлайн-форма, в которой есть несколько полей с данными о времени. Я храню эти данные в базе данных MySQL в поле time, которому нужен формат hh:mm:ss. Если пользователь вводит время в этом формате правильно, то я хочу принять данные. Я также хочу позволить пользователям вводить время в стандартном американском времени, например 9:30 am или 11:25 pm или 10:27 am и т. Д.

В основном я хочу проверить, находится ли время в правильном формате базы данных сначала (hh:mm:ss), затем, если это не так, проверить, находится ли оно во втором принятом формате (hh:mm am/pm), и если это так, тогда я буду использовать функцию PHP strtotime(), чтобы преобразовать ее в формат времени базы данных. Если это не в любом из этих форматов, тогда мы показываем сообщение об ошибке и умираем.

Кто-нибудь знает, как проверить, соответствует ли значение переменной одному из этих форматов времени?

Псевдо-PHP код того, что я хочу сделать:

<?php
    $value = //some time;
    if (is_database_time($value)){
        // good no problem
    }else if (is_usa_time($value)){
        $value = strtotime($value);
    }else{
        die("error incorrect time format, try again.");
    }
?>

** РЕДАКТИРОВАТЬ **

Спасибо всем за помощь. Я использовал некоторую информацию здесь, чтобы сделать функцию, которая прекрасно работает:

<?php
    function filter_time($key,$value){
        // this section handles the storage of time data
        if (preg_match('/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)){
            //do nothing
        }else if (preg_match('/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i', $value)){
            $value = date( 'H:i:s', strtotime($value));
        }else{
            display_error('incorrect time format in '.$key.' field.');
        }
        return $value;
    }
?>

Ответы [ 3 ]

8 голосов
/ 23 марта 2012

функция verify_time_format ()

function verify_time_format ($value) {

  $pattern1 = '/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/';
  $pattern2 = '/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i';
  return preg_match ($pattern1, $value) || preg_match ($pattern2, $value);

}

Возвращает ИСТИНА для следующих значений:

2:03:32
02:03:32
23:59:59
15:23 AM
15:23 am
09:41 pm
9:41 PM
etc...

Обновление:

function filter_time ($key, $value) {

  $p1 = '/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/';
  $p2 = '/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i';

  if (preg_match ($p1, $value) || preg_match ($p2, $value))
    $res = date ('H:i:s', strtotime ($value));

  else
    display_error ("incorrect time format in {$key} field.");

  return $res;

}
3 голосов
/ 23 марта 2012

Вы уже используете strtotime из PHP, и для значений, которые вы указали, действительно нет необходимости принудительно задавать определенный формат.

Что вы, вероятно, захотите проверить и убедиться, что поле проверяется только цифрами, двоеточием, а также am или pm, как в ответе Wh1T3h4Ck5.

С этим ваш код, вероятно, будет похож на следующий

<?php

  function valid_time($value) {//Wh1T3h4Ck5's function
    return preg_match('/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i', $value);
  }

  $value = //some time;
  if (vald_time($value)){
    $time_value = strtotime($value);
    echo $time_value;
  }else{
    die("Error incorrect time format, try again.");
  }
?>

Хотя более элегантное решение заключается в использовании JQuery / Javascript PRIOR для отправляемой формы. Вы можете проверить и предупредить пользователя о неправильном формате перед отправкой в ​​скрипт PHP. Оставьте валидацию в скрипте PHP, хотя и с другими мерами защиты, если это необходимо.

1 голос
/ 23 марта 2012

Вы можете использовать регулярное выражение, чтобы решить проблему довольно легко.Например:

<?php
  $databaseTimePattern = '/^(0[0-9])|(1[0-2]):[0-5][0-9]:[0-5][0-9]$/'; //Matches times in the form hh:mm:ss
  $usaTimePattern = '/^([1-9]|(1[0-2])):[0-5][0-9] [a|p]m$/'; //Matches times in the form hh:mm am/pm

  $value = //some time;
  if (preg_match($databaseTimePattern, $value)){
    // good no problem
  }else if (preg_match($usaTimePattern, $value)){
    $value = strtotime($value);
  }else{
    die("error incorrect time format, try again.");
  }
?>
...