preg_match
を使用して、時間入力がこの形式であることを検証しようとしています-"HH:MM"
正規表現を使用して確認できます。
12時間:
preg_match("/^(?:1[012]|0[0-9]):[0-5][0-9]$/", $foo)
24時間:
preg_match("/^(?:2[0-3]|[01][0-9]):[0-5][0-9]$/", $foo)
1:から24:59までの24時間時計を使用する場合は、
preg_match("/^(?:2[0-4]|[01][1-9]|10):([0-5][0-9])$/", $foo)
例外をスローせずに日付(および/または時刻)を検証する単純な関数。期待される 日付形式 をパラメーターとして使用します。
function isValidDate($date, $format = 'Y-m-d') {
$dateObj = DateTime::createFromFormat($format, $date);
return $dateObj && $dateObj->format($format) == $date;
}
動作方法:渡された$format
に従って入力日付をPHP DateTime
オブジェクトに変換し、このオブジェクトを元の入力日付と比較します。一致する場合、日付は有効であり、予期される形式です。
いくつかの使用例:
/* Valid Examples: */
isValidDate("2017-05-31");
isValidDate("23:15:00", 'H:i:s');
isValidDate("2017-05-31 11:15:00", 'Y-m-d h:i:s');
/* Invalid: */
isValidDate("2012-00-21");
isValidDate("25:15:00", 'H:i:s');
isValidDate("Any string that's not a valid date/time");
確認したい時刻が$timeStr
であり、日付の仕様に従ってH:i
の形式である必要があるとしましょう。これに正規表現を使用するのは、私見ばかげています。これはとても読みやすいです:
[〜#〜]更新[〜#〜]
$timeStr = " 02:00"; //example of valid time, note whitespace
test($timeStr);
$timeStr = "23:59"; //valid
test($timeStr);
$timeStr = "24:00"; //invalid
test($timeStr);
$timeStr = "25:00"; //invalid
test($timeStr);
$timeStr = "16:61"; // invalid
test($timeStr);
//tests 23:59 hour format
function test($timeStr){
$dateObj = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . $timeStr);
if ($dateObj !== false && $dateObj && $dateObj->format('G') ==
intval($timeStr)){
//return true;
echo 'valid <br/>';
}
else{
//return false;
echo 'invalid <br/>';
}
}
文字列が00:00から23:59の間の時間かどうかを確認するコードは次のとおりです
$checked = false;
if (preg_match('/^\d{2}:\d{2}$/', $str)) {
if (preg_match("/(2[0-3]|[0][0-9]|1[0-9]):([0-5][0-9])/", $str)) {
$checked = true;
}
}
var_dump($checked );die;
午前と午後を行うことができる12時間の試合の場合、これを使用します
/^(1[0-2]|0?[1-9]):[0-5][0-9] (AM|PM)$/i
午前1時20分または午前1時20分を処理します。上記の12時間の例は、可能性があるため、正しくありませんでした。
00:20
これは有効な12時間形式ではありません。
できるよ:
if(preg_match('/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/',$input)) {
// $input is valid HH:MM format.
}
@Toskanの記述を拡張して、これを00:00形式で検証することができます。有効で、00:00から23:59の場合にtrueを返します。
これにより、さまざまな時間形式を使用することもできます...
function isTimeValid($time_str, $format = 'H:i')
{
$DateTime = \DateTime::createFromFormat( "d/m/Y {$format}", "10/10/2010 {$time_str}" );
return $DateTime && $DateTime->format( "d/m/Y {$format}" ) == "10/10/2010 {$time_str}";
}
希望する形式に従って、時間、分、秒を検証する関数:
function validTime($time, $format='H:i:s') {
$d = DateTime::createFromFormat("Y-m-d $format", "2017-12-01 $time");
return $d && $d->format($format) == $time;
}
$valid = validTime("23","H");
$valid = validTime("23:59","H:i");
$valid = validTime("23:59:59","H:i:s");
$valid = validTime("23:59:59");
$valid = validTime("25","H");
$valid = validTime("01:60","H:i");
$valid = validTime("01:20:61","H:i:s");
$valid = validTime("01:20:61");
チャールズのエレガントな回答と正規表現に基づいています。 "HH:MM"
と"H:MM"
(つまり"9:45"
/"09:45"
)の両方を1行で検証する必要がある場合は、次の正規表現を使用して24時間形式に一致させます。
preg_match("/^(?(?=\d{2})(?:2[0-3]|[01][0-9])|[0-9]):[0-5][0-9]$/", $time)
(?
は 条件付きサブパターン を表し、構文は次のとおりです。
(?(condition)yes-pattern|no-pattern)
?=
inconditionis regexp assertion
?:
inyes-patternは、パフォーマンス向上のためにoptionalであり、ドロップしてもかまいません。つまり、括弧()
内に capturing は必要ありません。代替機能だけが必要です。
したがって、以下についてのみ説明します。
$time
文字列が2桁の(?=\d{2})
で始まる場合は、(2[0-3]|[01][0-9])
パターンを使用してHH時間表記に一致させます("09:45"
の場合)[0-9]
パターンを使用してH時間表記に一致させます("9:45"
ケース)彼らが言うように、シンプルさは才能の姉妹です。上記の条件パターンは必ずしも必要ではありません。 24時間形式の"HH:MM/H:MM"
のより簡単な検証:
preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $time)
繰り返しますが、グループ化括弧内の?:
()
は、キャプチャーを無効にするためのオプションです。ドロップすることができます。
したがって、この正規表現では、()
を使用した代替サブパターンは、最初の(20..23
)および2番目の(01..19
)パターンで2桁の時間、最後の3番目のパターンで1桁を照合しようとしています。 (0..9
)。
さらに、12時間形式の"HH:MM/H:MM"
の検証:
preg_match("/^(?:0?[1-9]|1[012]):[0-5][0-9]$/", $time);
ここでは、最初の1桁(1..9
)と可能な先行ゼロ(0?
)、次に2桁(10..12
)を照合しようとしています。
秒(24時間)を探している場合。これは私にとって魅力のように働きました。
$time = "23:59:60";
preg_match("/^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $time)
HH:MM文字列のみを検証する場合の@Toskanの正解
protected function isValidTime($timeStr){
$dateObj = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . $timeStr);
$dateObjOffset = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . '24:00');
if($dateObjOffset <= $dateObj){
return false;
}
if ($dateObj !== false) {
return true;
}
else{
return false;
}
}
preg_match
を必要としない場合は、次の新しい方法があります。
$thetime = "20:15" // set the time
$timecheck = explode(":", filter_var($thetime, FILTER_SANITIZE_URL));
$hourvalid = $minvalid = false;
if (count($timecheck) > 1 && count($timecheck) < 4) {
$hourvalid = ((abs(filter_var($timecheck[0], FILTER_SANITIZE_NUMBER_INT)) < 24)
&& (abs(filter_var($timecheck[0], FILTER_SANITIZE_NUMBER_INT)) === (INT) $timecheck[0]))
? true : false;
$minvalid = ((abs(filter_var($timecheck[1], FILTER_SANITIZE_NUMBER_INT)) < 60)
&& (abs(filter_var($timecheck[1], FILTER_SANITIZE_NUMBER_INT)) === (INT) $timecheck[1]))
? true : false;
}
if ($hourvalid && $minvalid) {//valid time
echo $thetime . " is a valid time<br />";
} else {//invalid time
echo $thetime . " is NOT a valid time<br />";
}
おそらく世界で最も効率的な方法ではありませんが、それはそれを成し遂げます。 00:00
から23:59
までの時間にのみ有効です。また、8:0
は時間として検証されます(08:00
を意味する場合)。