簡単なプログラムを作成してみよう
日付チェック
ユーザーの入力値チェックの練習のために、日付データ(ここでは誕生日)をチェックする方法について検討していきます。
ユーザーからの入力をテキストフィールドにすると、日付データにはいろいろなパターンが考えられます。例えば、誕生日が、1985年4月1日の場合、テキストフィールドに入る文字には、以下のような文字が考えられます。
「1985-04-01」「1985-4-1」「1985/04/01」「1985/4/1」「19850401」「1985年4月1日」「1985年04月01日・・・
全角文字が使われる場合もあるので、上に挙げた倍のパターンが存在します。さらに、入力ミスで「198500401」といった存在しない日の入力も考えられます。
これを、細かくパターン分けして、それぞれに対して入力値チェックのルールを記述していくのは非常に大変です。入力された日付が実際に存在するかどうかチェックすることを考えると、年、月、日に分離できる必要があります。
そうすると入力インターフェースは、記入例を記載する図4(a)の場合と、リストメニューを使って年、月、日を別々に入力してもらう図4(b)のパターンが考えられます。Ajaxインターフェースなどを使うと、いろいろな入力インターフェースが考えられますが、ここでは図4の(a)(b)のパターンで考えていきます。
まずは、図4(a)のパターンで考えてみます。このパターンで入力されたものを誕生日データとして受け付けるには、次のようにSTEP1~STEP5までの項目をプログラムに書く必要があります。
STEP1:空白チェック。
STEP2:文字数チェック、半角10文字、YYYY-MM-DD。
STEP3:年、月、日への分離、分離記号は、"-"。年:YYYY、月:MM、日:DD。
STEP4:YYYYの範囲、1900年以降から現在の年まで。MMの範囲、01~12。DDの範囲、01~31。
STEP5:YYYY年MM月DD日は、存在する日かどうか。
厳密に日付の形式をチェックするとこのようになります。プログラムの作り方によっては、これらのSTEPを同時にチェックすることも可能です。
次に、図4(b)のパターンで入力されてた場合は、POSTする段階で、すでに年、月、日に分離されているので、チェック項目を減らすことができます。具体的には、上記のSTEP3~STEP5のチェック機能があれば十分です。
正規表現によるチェック
日付データは、正規表現を使うと簡単にチェックできるようになります。正規表現とは、文字列のパターンを特殊な記号で表現したものです。ノンプログラマーの方は、正規表現をインターネットで調べて、それを利用するとよいでしょう。
今回は、正規表現の説明は必要最小限にして、正規表現の使い方に重点を置くようにします。
まず、日付を「数字4けた-数字2けた-数字2けた」とした時に、正規表現で表すと「^\d{4}-\d{2}-\d{2}$」になります。個々の意味は、以下の通りです。
^:先頭
\d:半角の数字
{4}:直前の文字が4文字
-:-がある
{2}:直前の文字が2文字
$:最後
年を19XX年、20XX年限定、月を01~12、日を01~31と限定した正規表現は次のようになります。
^(19|20)\d{2}-(0\d|1\d)-(0\d|[12]\d|3[01])$
こちらの方が、厳密なチェックができます。ただし、月末や2月の処理が不十分です。うるう年の処理までは、正規表現で表すのは無理です。正規表現を使って、文字列パターンが合っているかどうかをPHPで調べる方法は、下記のようになります。
$date_str = "1985-04-01"; //ここに評価したい文字列を入れる
//正規表現
$pattern = '/^(19|20)\d{2}-(0\d|1\d)-(0\d|[12]\d|3[01])$/';
if(preg_match($pattern, $date_str)) {
echo "パターンが正しい";
} else {
echo "パターンが正しくない";
}
このPHPの記述パターンで、正規表現の所に、調べたいパターンをインターネットから持ってきて埋めてあげれば、いろいろなパターンチェックができるようになります。正規表現は、最初は難しく感じられるかもしれませんが、使うだけならだれでも簡単に導入できますので、ぜひ活用してください。