【PHP入門】数値や時刻などの表現を正規表現でチェックする

Webアプリを作成する際には入力フォームなどで入力したデータが適切な値かどうかをしばしばチェックする必要があります。

その方法は様々ですが、ここではPHP言語を用いた正規表現でデータを調べる方法について解説します。

Webアプリを作成する際には入力フォームなどで入力したデータが適切な値かどうかをしばしばチェックする必要があります。

その方法は様々ですが、ここではPHP言語を用いた正規表現でデータを調べる方法について解説します。

データの種類によっては正規表現以外にも手軽な方法があるものもあるので、それも併せて紹介します。


・型チェックと正規表現
・数値のチェック
・日付・時刻のチェック
・メールアドレスのチェック
・ファイルの拡張子のチェック
・URLのチェック
・正規表現とPHP

といった順序で、実際に様々なケースの具体的記述例と発展的な内容について解説します。

型チェックと正規表現

PHPでの正規表現(せいきひょうげん)および型チェックについて説明する前に、そもそも正規表現とは何かということについて説明します。

正規表現とは、電話番号やメールアドレスなどといった一定のパターンのある文字列データを、いくつかの文字列を一つの形式で表現するための表現方法を言います。

抽象的な説明だけではわかりずらいので、実例をあげましょう。例えば、

apple
orange
grape
lemon

といったようなアルファベットの小文字の組み合わせは、正規表現を用いると

[a-z]+

と表されます。正規表現を用いられるのはPHP言語だけではありません。そのため、いったんマスターしてしまえば他の言語でも使えます。

とはいえ、一から正規表現を自分で作るのはなかなか難しいものです。

ただPHPに関していえば、PHPチェッカーという非常に便利なツールが存在します。このツールに関しては、以下の記事で紹介していますので参考にしてみてください。

PHPで正規表現入門!7分で書き方・チェッカーツールの使い方を学ぼう
更新日 : 2019年5月21日

これを使えばPHPにおける正規表現のチェックが容易に行えます。

また、よく使う表現に関してはすでに様々な場所で紹介されていますので、ここでまとめて紹介します。

さらに、表現の仕方によっては必ずしも正規表現を使わなくてよいケースもあるので、それもここでは紹介します。

なお正規表現について詳しく学びたい方は以下を参考にしてみてください。

【PHP入門】正規表現で検索・抽出・置換する5つの関数を使い倒せ!
更新日 : 2019年5月11日

また正規表現を用いて文字列の変換などを行いたい場合は更に以下のサイトを参考にすると良いでしょう。

【PHP入門】正規表現で置換する方法
更新日 : 2019年5月20日

数値のチェック

手始めに、数値のチェックを紹介しましょう。
数値のチェックは非常によく行われるため必ずしも正規表現を使う必要がありません。

ここではもともと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 = '[email protected]';

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で正規表現用いるさいの便利なツール

冒頭で、正規文法チェッカーを紹介しましたが、この他にも、正規文法が正しいかをチェックしてくれる

正規表現デバッグツール

や、リアルタイムで正規表現のチェックをしてくれる

PHP Live Regex

といったツールが存在します。
これらのツールは新しいパターンを作らなくてはならないときなどにはチェックツールとして用いると大変便利です。

Laravelなどのフレームワークにおける正規表現

またPHP本体のみならず、Laravelなどのフレームワークでもvalidationという正規表現によく似た大変な仕組みがあります。

たとえば、Laravelでvalidationを用いると以下のようになります。

$validator = Validator::make(
    array('name' => 'Dayle'),
    array('name' => 'required|min:5')
);

一つ目の配列が評価をする単語で、二つ目がチェック方法です。これは必ず入力すること、そして最低5文字であることを意味しています。

正規表現は万能ですがなかなか複雑です。そのため、validationではなるべく簡単に正規表現と似た効果を得ることを期待しています。

もちろん正規表現との併用もできます。

まとめ

ここでは以下のように

・ 型チェックと正規表現
・ 数値のチェック
・日付・時刻のチェック
・ メールアドレスのチェック
・ ファイルの拡張子のチェック
・ URLのチェック
・ 正規表現とPHP

といった流れでPHPで正規表現を使うを紹介してきました。

正規表現はなかなか便利ですが、同時に大変難しいものです。

そのため、出来るだけ先人たちが作ったパターンを活用したり、ツールを上手に使ったり、同様の効果を得られるもっと簡単な関数などと併用するとより効果的でしょう。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。