1

を使用して時間入力 (午前 10 時 30 分、午後 2 時 30 分など) を検証したいpreg_match()

私はこれを使って、

 $pattern   =   "/([1-12]):([0-5])([0-9])( )(am|pm|AM|PM)/";
 if(preg_match($pattern,$time)){
   return true;
 }

しかし、次のような入力を10:30 pmxxxxすると、検証されません。その方法が正しいかどうかはわかりません。助けてください。

4

3 に答える 3

7

DATETIME ソリューション

DateTime::createFromFormatを使用して、すべての日付/時刻文字列を検証できます。

関数

function isTimeValid($time) {
    return is_object(DateTime::createFromFormat('h:i a', $time));
}

foreach (['12:30 am', '13:30 am', '00:00 pm', '00:00 am', '12:30am', '15:50pm'] as $time) {
    echo "Time '$time' is " . (isTimeValid($time) ? "" : "not ") . "valid.\n";
}

出力例

Time '12:30 am' is valid.
Time '13:30 am' is not valid.
Time '00:00 pm' is valid.
Time '00:00 am' is valid.
Time '12:30am' is valid.
Time '15:50pm' is not valid.
于 2012-10-06T12:07:52.357 に答える
2

正規表現の[...]表記法は、文字クラスを定義します。つまり、単一の文字に適用されるものです。代わりにここで使用する必要があるのは代替です。

0[1-9]|1[0-2]

...したがって、正規表現全体は次のようになります。

/^(?:0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$/
于 2012-10-06T11:19:12.113 に答える
1

正規表現ソリューション

  • [1-12]これは範囲定義ではないため、機能しませんが[] 開始文字クラス定義と終了文字クラス定義を意味します
  • /i 最後にパターン修飾子を使用するので、PM, pm, pM, Pm, AM, am, aM, Am組み合わせを書く必要はありません。
  • PMとAMのフェッチは、で簡単に行うことができ[ap]mます。
  • 文字列全体を検証する場合は、文字列は最初から最後までとで有効である必要があり^ます$
  • 時間とpm|amの間に\h エスケープシーケンス(水平方向の空白文字)を追加したので、時間のような10:10amものを有効にすることができます。

コード:

$time = '10:30 am';
$pattern = '~^(0[0-9]|1[0-2]):([0-5][0-9])\h*([ap]m)$~i';
if (preg_match($pattern, $time, $m)) {
    print_r($m);
    return true;
}

出力

Array
(
    [0] => 10:30 am
    [1] => 10
    [2] => 30
    [3] => am
)
于 2012-10-06T11:46:29.957 に答える