2011-01-22 12 views
1

正規表現初心者! オプションのスペースとAMまたはPM接尾辞付きのHH:MMの形式の時間文字列を検証したいと思います。固定フォーマット番号と正規表現のオプション文字列の一致

例:10:30または10:30 AMの両方が有効です。また

$test = '12:34'; 
    if(!preg_match("/^\d{2}:\d{2}?\s(AM|PM)$/", $test)) 
    { 
     echo "bad format!"; 
    } 

、それはHHまたはMM値が< = 12と< = 60、それぞれ同じ正規表現の中にあることを検証することが可能である:ここでは

は、私がこれまでに失敗している必要があり何ですか?

よろしくお願いします。

答えて

3

これを試してみてください:

はここで最後の部分 (?:\s?[AP]M)?
/^\d{2}:\d{2}(?:\s?[AP]M)?$/ 

は、オプションの空白文字で始めることができ、その後、AMまたはPMのいずれかが続いているnon-capturing groupオプションです。

番号の範囲は、最初の\d{2}(?:0\d|1[012])で置き換え、2番目を(?:[0-5]\d|60)で置き換えます。あなたがそれらをキャプチャして比較演算子を使用することができ、有効分と時間を一致させるための正規表現を使用する

+0

素晴らしい、ありがとう!まさに私が探していたもの。 – Ben

+0

@Ben:ようこそ!ちなみに、分は0-59になり、60は既に次の時間です。そして、時間については、次の12時間に12 = 0となります。 – Gumbo

+0

もう少し詳しい情報がありますか?私は24時間形式をサポートしようとしているので、最初の2桁、つまり<= 24であることができますが、完全に - (?:0 \ d | 1 [012]) 'という構文は理解できません。 これがどのように故障するのかアドバイスできますか? 多くのおかげで、ベン。 – Ben

0

オルタナティブ:

$test = '12:14'; 
if(preg_match("/^(\d{2}):(\d{2})(?:\s?AM|PM)?$/", $test,$m) && 
    $m[1] >= 0 && $m[1] < 12 && 
    $m[2] >= 0 && $m[2] < 60) { 
     echo "good format"; 
} else { 
     echo "bad format!"; 
} 
関連する問題