2013-11-04 18 views
7

日付正規表現バリデーターを作成しようとしています。私が抱えている問題は、"date"タイプの入力フィールドを使用していることです。これはChromeの魅力のように機能します。それはクロムのようなカレンダーのようなものを開きますが、それ以外は何もしませんので、残りの日付を手動で入力することにしました。正規表現でYYYY-MM-DD形式のPHPで日付を検証する

これは、メッセージ(私はYYYY-MM-DD形式を探しています)投げ、私のエラーです:私はこのことについての例がたくさんあるけど、私はすでに20のようにしようと、私

$date_regex ='#^(19|20)\d\d[\- /.](0[1-9]|1[012])[\- /.](0[1-9]|[12][0-9]|3[01])$#'; 
$hiredate = $_POST['hiredate']; 
if (!preg_match($date_regex, $hiredate)){ 
    $errors[] = 'Your hire date entry does not match the YYYY-MM-DD required format.'; 
} 

をそれを解決できませんでした。たぶん私は何かが欠けているでしょう。

<input type="date" name="hiredate" /> 
+1

代わりにcheckdate()を使用してください。 –

+0

標準的な手順はありますか?私は別の投稿でそれを見つけたが、私のために働かなかった。参考までに、YYYY/MM/DDまたはYYYY.MM.DDまたはYYYY-MM-DDのように挿入したいと思います。それらをあまりにも拘束しないために。 – Cataneo

+3

3つの別々の ''ボックスを適切なmaxlengthと数字だけのバリデーションで提供する方が簡単でしょうか?それはバックエンドで適切なフォーマットに連結されますか?それぞれの入力ボックスにリスナを追加して、人が2桁の「キーを押した」場合、次の1つに移動することができます。ユーザーが必要なフォーマットについてラットに知らせることはありません。自分のネイティブフォーマットでない場合は、最高の状態で欲求不満を感じます。 – MonkeyZeus

答えて

10

エスケープされていないため、正規表現が機能しませんでした/区切り文字。

次のようなフォーマットYYYY-MM-DDで日付を検証します正規表現:

^(19|20)\d\d[\-\/.](0[1-9]|1[012])[\-\/.](0[1-9]|[12][0-9]|3[01])$ 

それが今年は月12よりも大きくないと、19または20で始まり、等しくないことを検証します0とその日が31より大きくなく、0と等しくないことを意味する。あなたの最初の例を使用して

Example Online

、あなたはこのようにそれをテストすることができます:

$date_regex = '/^(19|20)\d\d[\-\/.](0[1-9]|1[012])[\-\/.](0[1-9]|[12][0-9]|3[01])$/'; 
$hiredate = '2013-14-04'; 

if (!preg_match($date_regex, $hiredate)) { 
    echo '<br>Your hire date entry does not match the YYYY-MM-DD required format.<br>'; 
} else { 
    echo '<br>Your date is set correctly<br>';  
} 

Example Online

+1

うん、これは大丈夫でした。私は非常に多くの変種を使用して正規表現のそれはひどくそれを変更している必要があります。あなたはイリアロストヴェツェフがそこにいる大きな目。 – Cataneo

13

はこのために正規表現を使用しないでください、あなたはもっとここで読むことができますDateTime::createFromFormat

// specify your date's original format, in this example m/d/Y (e.g. 08/31/2013) 
$format = "m/d/Y"; 
$hireDate = DateTime::createFromFormat($format, $_POST['hiredate']); 
if(!$hireDate) { 
// createFromFormat returns false if the format is invalid; 
} else { 
    //change it to any format you want with format() (e.g. 2013-08-31) 
    echo $hireDate->format("Y-m-d"); 
} 

を使用して同じ結果を得ることができます:ここで

は多少関連がある場合は、入力フィールドの

http://php.net/manual/en/datetime.createfromformat.php

Ho wever、それは問題がPHPと全く無関係なようです。

PHPはバックエンドで動作します。フロントエンドの問題があるようです。

また、使用する入力タイプが問題であるかどうかは疑問です。 1つのブラウザーが指定した入力タイプをサポートしていない場合は、デフォルトでtextになります。

http://jsfiddle.net/FKGCA/

私のブラウザは<input type="whatever" />が何であるかを知らないので、デフォルトで「テキスト」への入力タイプ:ここでそれを参照してください。 <form action="myForm.php" method="POST"></form>タグで4つの入力をラップすると、サーバーは入力が非表示、ラジオボタン、選択、テキスト、またはパスワードであるかどうか気にしない/認識しないため、サーバーに入力を送信します。サーバーは生データのみを受信します。

あなたの問題はあなたのPHPではなく、あなたのJavascriptである可能性があります。あなたのウィジェットを表示していないブラウザがあなたのページに何らかのエラーがあることを伝えているかどうかを調べてみてください。

SafariとFirefoxには開発ツールやデバッグツールがありますが、IEについてはあまりよくありません。

+0

それはまさに私が述べていたものでした。 「ウィジェット」はChromeで動作し、他のタイプのテキスト入力タイプに変換されます。それがまさに私が検証しようとしていることです。私は日付形式をアップし、フィールドを3つに分割してそこから移動します。 – Cataneo

+1

gotcha、これはjQueryが便利な場合です。それ以外の場合は、サポートをテストする必要があります:http://diveintohtml5.info/detect.html#input-typesおよびサポートされていない場合。あなたはjavascriptベースの代替(jQueryなど)を使用する必要があります – ILikeTacos

0

チェックして参照してください1行の文で

function isValidDate($date) { 
    return preg_match("/^(\d{4})-(\d{1,2})-(\d{1,2})$/", $date, $m) 
     ? checkdate(intval($m[2]), intval($m[3]), intval($m[1])) 
     : false; 
} 

YYYY-MM-DD日付を検証詳細私の答えはhereです。

盲目的に日付を検証するのにDateTime::createFromFormatを使用しないでください。のは存在しない日付2018-02-30を取り、見てみましょう:

$d = DateTime::createFromFormat("Y-m-d", "2018-02-30"); 
var_dump((bool) $d); // bool(true) 

あなたが期待するようはい、それはtrue、ないfalseを返します。さらに興味深い:また

$d = DateTime::createFromFormat("Y-m-d", "2018-99-99"); 
var_dump((bool) $d); // bool(true) 

true ...だから、それは数字の数だけを検証します。もう一度試してください:

$d = DateTime::createFromFormat("Y-m-d", "ABCD-99-99"); 
var_dump($d); // bool(false) 

最後にfalseです。私たちはこのスニペットから見ることができます何ここで起こっている

$d = DateTime::createFromFormat("Y-m-d", "2018-02-30"); 
var_dump($d); 

// var_dump OUTPUT 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2018-03-02 16:41:34.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(3) "UTC" 
} 

我々は存在しない2018-02-30を渡すとき、あなたが見ることができるように、DateTimeオブジェクトが2018-03-02が含まれています。 2018年2月が28日、つまり最大日が2018-02-28であるため、30を渡すと、createFromFormatは2018-02-01に30日を追加し、日付の前に検証することなく新しい日付を作成するためです。