Webアプリを作成する際には入力フォームなどで入力したデータが適切な値かどうかをしばしばチェックする必要があります。
その方法は様々ですが、ここではPHP言語を用いた正規表現でデータを調べる方法について解説します。
Webアプリを作成する際には入力フォームなどで入力したデータが適切な値かどうかをしばしばチェックする必要があります。
その方法は様々ですが、ここではPHP言語を用いた正規表現でデータを調べる方法について解説します。
データの種類によっては正規表現以外にも手軽な方法があるものもあるので、それも併せて紹介します。
・型チェックと正規表現
・数値のチェック
・日付・時刻のチェック
・メールアドレスのチェック
・ファイルの拡張子のチェック
・URLのチェック
・正規表現とPHP
といった順序で、実際に様々なケースの具体的記述例と発展的な内容について解説します。
型チェックと正規表現
PHPでの正規表現(せいきひょうげん)および型チェックについて説明する前に、そもそも正規表現とは何かということについて説明します。
正規表現とは、電話番号やメールアドレスなどといった一定のパターンのある文字列データを、いくつかの文字列を一つの形式で表現するための表現方法を言います。
抽象的な説明だけではわかりずらいので、実例をあげましょう。例えば、
apple orange grape lemon
といったようなアルファベットの小文字の組み合わせは、正規表現を用いると
[a-z]+
と表されます。正規表現を用いられるのはPHP言語だけではありません。そのため、いったんマスターしてしまえば他の言語でも使えます。
とはいえ、一から正規表現を自分で作るのはなかなか難しいものです。
ただPHPに関していえば、PHPチェッカーという非常に便利なツールが存在します。このツールに関しては、以下の記事で紹介していますので参考にしてみてください。
これを使えばPHPにおける正規表現のチェックが容易に行えます。
また、よく使う表現に関してはすでに様々な場所で紹介されていますので、ここでまとめて紹介します。
さらに、表現の仕方によっては必ずしも正規表現を使わなくてよいケースもあるので、それもここでは紹介します。
なお正規表現について詳しく学びたい方は以下を参考にしてみてください。
また正規表現を用いて文字列の変換などを行いたい場合は更に以下のサイトを参考にすると良いでしょう。
数値のチェック
手始めに、数値のチェックを紹介しましょう。
数値のチェックは非常によく行われるため必ずしも正規表現を使う必要がありません。
ここではもともとPHPに用意されている関数と正規表現を使う方法を併記しておくことにしましょう。
PHPの関数によるチェック
まずは、一番簡単な方法である、関数によるチェック方法を見てみましょう。
PHPには、入力されたが数値かどうかをチェックする関数であるis_numericが存在します。
<?php $num = 123.456; if (is_numeric($num)) { echo '数値です'; } else { echo '数値ではありません'; }?>
数値です
また、特に数値が整数かどうかをチェックしたければis_intを使うと便利です。
<?php $num = 100; if (is_int($num)) { echo '整数です'; } else { echo '整数ではありません'; }?>
整数です
ちょっとした数値・整数の場合は、これらを使えば十分です。
正規表現によるチェック
次に正規表現を使った数値チェックのサンプルを紹介します。
PHPで正規表現を用いるにはpreg_match関数を用います。以下のすべてのサンプルでこの関数を使用しています。
指定した文字列の中に数値が含まれているか、チェックする場合は「\d+」で数値が含まれているか確認する方法や、「[0-9]」で0~9の数値が含まれているか確認する方法があります。
<?php $num_text = 'ABC123'; if (preg_match('/\d+/', $num_text)){ echo '数値が含まれています'; }else{ echo '数値は含まれていません'; } ?>
実行結果
数値が含まれています
全て数値かチェックする場合は、「^[0-9]+$」で文字列が0~9の範囲の数値であることを確認します。
<?php $num_text = '123456'; if (preg_match('/^[0-9]+$/', $num_text)){ echo '全て数値です'; }else{ echo '全て数値ではありません'; } ?>
実行結果
全て数値です。
整数や自然数を正規表現でチェックすることもできますが表現がかなり複雑です。そのような場合、PHPの関数を利用するのが一番手軽です。
日付・時刻のチェック
では次に日付、特に時刻をチェックする見てみましょう。まずは日付チェックの方法から紹介します。
日付書式:YYYY-mm-dd
チェック方法:|\数値4桁\-\数値1~2桁\-\数値1~2桁|
<?php $date_text = '2017-05-01です。'; if (preg_match('|\d{4}\-\d{1,2}\-\d{1,2}|', $date_text)){ echo '正しい日付です'; }else{ echo '不正な日付です'; } ?>
実行結果
正しい日付です
ここで「-」を「/」に変えるなどすると様々な書式への対応がになります。
時刻をチェックする
次に時刻をチェックする方法を見てみることにしましょう。
時刻をチェックする場合は、以下の数値のパターンと桁数を指定します。
時刻書式:hh:mm:ss
チェック方法:|\d{2}\:\d{2}\:\d{2}|
<?php $date_text = '20:10:10'; if (preg_match('|\d{2}\:\d{2}\:\d{2}|', $date_text)){ echo '正しい時刻です'; }else{ echo '不正な時刻です'; } ?>
実行結果
正しい時刻です
さらに、正しい時刻を表現したい場合、以下のようにすることが出来ます。
時刻書式:00:00:00~23:59:59
if (preg_match('/(0[0-9]{1}|1{1}[0-9]{1}|2{1}[0-3]{1}):(0[0-9]{1}|[1-5]{1}[0-9]{1}):(0[0-9]{1}|[1-5]{1}[0-9]{1})$/', $date_text)){ echo '正しい時刻です'; }else{ echo '不正な時刻です'; }
メールアドレスのチェック
次にメールアドレスのチェック方法を紹介します。
メールアドレスをチェックする場合は「ローカル部@ドメイン」の構文に基づいて正規表現を指定してチェックを行います。
[a-zA-Z0-9_\.\-]のいずれかの文字列か数値、記号で1文字以上、@(アットマーク)からは[a-zA-Z0-9\-]の文字列か数値、記号、.(ピリオド)からは([a-zA-Z0-9]{2,4})の文字列か数値で2~4文字の範囲となります。
<?php $mail_text = 'samurai@Engineer.com'; if (preg_match('/^([a-zA-Z0-9_\.\-]+)\@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9]{2,4})$/', $mail_text)){ echo '正しいメールアドレスです'; }else{ echo '不正なメールアドレスです'; } ?>
実行結果
正しいメールアドレスです
ファイルの拡張子のチェック
次にファイル拡張子をチェックしてみます。
例えば、「.txt「.docx」「.xlsx」「.zip」「.tar」「.jpg」などの拡張子か判断したい場合は、以下のサンプルのように記述します。
実行結果
正しい拡張子です
書き方は簡単なので、容易に新しい拡張子を追加できます。
URLのチェック
次はホームページのアドレスであるURLをチェックする方法です。
URLをチェックするためには正規表現パターンでURL先頭のhttpまたはhttpsで始まる文字列をチェックし、その後に続く文字列や数値、記号をチェックします。
例えば、以下の例では大文字小文字を区別しないhttpまたはhttpsで始まり、その後に://などの記号のあとにアルファベットのa~zA~Z、数値、各種記号を正規表現のパターンで指定しています。
<?php $url_text = 'http://www.sejuku.net/'; if (preg_match('/^(http|https)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $url_text)){ echo '正しいURLです'; }else{ echo '不正なURLです'; } ?>
実行結果
正しいURLです
正規表現とPHP
最後にPHPで正規表現を用いる際に便利なツールや情報を紹介しましょう。
PHPで正規表現用いるさいの便利なツール
冒頭で、正規文法チェッカーを紹介しましたが、この他にも、正規文法が正しいかをチェックしてくれる
や、リアルタイムで正規表現のチェックをしてくれる
といったツールが存在します。
これらのツールは新しいパターンを作らなくてはならないときなどにはチェックツールとして用いると大変便利です。
Laravelなどのフレームワークにおける正規表現
またPHP本体のみならず、Laravelなどのフレームワークでもvalidationという正規表現によく似た大変な仕組みがあります。
たとえば、Laravelでvalidationを用いると以下のようになります。
$validator = Validator::make( array('name' => 'Dayle'), array('name' => 'required|min:5') );
一つ目の配列が評価をする単語で、二つ目がチェック方法です。これは必ず入力すること、そして最低5文字であることを意味しています。
正規表現は万能ですがなかなか複雑です。そのため、validationではなるべく簡単に正規表現と似た効果を得ることを期待しています。
もちろん正規表現との併用もできます。
まとめ
ここでは以下のように
・ 型チェックと正規表現
・ 数値のチェック
・日付・時刻のチェック
・ メールアドレスのチェック
・ ファイルの拡張子のチェック
・ URLのチェック
・ 正規表現とPHP
といった流れでPHPで正規表現を使うを紹介してきました。
正規表現はなかなか便利ですが、同時に大変難しいものです。
そのため、出来るだけ先人たちが作ったパターンを活用したり、ツールを上手に使ったり、同様の効果を得られるもっと簡単な関数などと併用するとより効果的でしょう。